﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-mysileng-随笔分类-杨强linux视频笔记系列</title><link>http://www.cppblog.com/mysileng/category/20285.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 30 Jan 2013 08:25:21 GMT</lastBuildDate><pubDate>Wed, 30 Jan 2013 08:25:21 GMT</pubDate><ttl>60</ttl><item><title>linux高级编程day13 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/29/197619.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 29 Jan 2013 10:35:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/29/197619.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197619.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/29/197619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197619.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 回顾：&nbsp;&nbsp;线程与进程&nbsp;&nbsp;1.进程由于资源独立，进程的主要关注是解决资源共享&nbsp;&nbsp;2.线程先天是数据共享,线程主要关注共享数据脏&nbsp;&nbsp;&nbsp;&nbsp;1.互斥量(线程内)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读写锁&nbsp;&nbsp;&nbsp;&nbsp;2.信号/条件量调度...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/29/197619.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-29 18:35 <a href="http://www.cppblog.com/mysileng/archive/2013/01/29/197619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day12 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/17/197340.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Thu, 17 Jan 2013 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/17/197340.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197340.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/17/197340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197340.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.多线程&nbsp;&nbsp;1.了解多线程&nbsp;&nbsp;&nbsp;&nbsp;解决多任务实现。&nbsp;&nbsp;&nbsp;&nbsp;历史上Unix服务器不支持多线程&nbsp;&nbsp;&nbsp;&nbsp;Unix/Linux上实现多线程有两种方式：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内核支持多线程&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/17/197340.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-17 14:30 <a href="http://www.cppblog.com/mysileng/archive/2013/01/17/197340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day11 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/13/197229.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Sun, 13 Jan 2013 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/13/197229.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197229.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/13/197229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197229.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 回顾：&nbsp;&nbsp;多进程的问题：数据共享。&nbsp;&nbsp;多进程的问题：&nbsp;进程的上下文环境(context)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件描述符号是整数以及对应上下文环境&nbsp;&nbsp;多进程的问题：上下文环境共享一.SELECT TCP服务器编程模式&nbsp;1....&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/13/197229.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-13 11:04 <a href="http://www.cppblog.com/mysileng/archive/2013/01/13/197229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day10 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/10/197163.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Thu, 10 Jan 2013 04:49:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/10/197163.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197163.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/10/197163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197163.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.TCP的编程模型&nbsp;回顾：&nbsp;&nbsp;UDP模型的UML图&nbsp;&nbsp;TCP模型的UML图&nbsp;案例1：&nbsp;&nbsp;TCP的服务器（在案例中使用浏览器作为客户程序）&nbsp;&nbsp;&nbsp;socket建立服务器的文件描述符号缓冲&nbsp;bind把IP地址与端口设置到文件描述符号中&nbsp;listen负责根据客户连接的不同IP...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/10/197163.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-10 12:49 <a href="http://www.cppblog.com/mysileng/archive/2013/01/10/197163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day09 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/08/197102.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 08 Jan 2013 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/08/197102.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197102.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/08/197102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197102.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->struct&nbsp;&nbsp;sembuf&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sem_num;//下标&nbsp;&nbsp;&nbsp;&nbsp;in...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/08/197102.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-08 12:18 <a href="http://www.cppblog.com/mysileng/archive/2013/01/08/197102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day08 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/06/197008.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Sun, 06 Jan 2013 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/06/197008.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/197008.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/06/197008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/197008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/197008.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.基于文件的通信&nbsp;&nbsp;1.普通文件(io/mmap)&nbsp;&nbsp;2.有名管道文件&nbsp;&nbsp;3.匿名管道&nbsp;&nbsp;4.Socket二.基于内存的通信&nbsp;&nbsp;0.一组内核内存的工具&nbsp;&nbsp;&nbsp;&nbsp;ipcs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipcs -m&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/06/197008.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/197008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-06 11:32 <a href="http://www.cppblog.com/mysileng/archive/2013/01/06/197008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day07 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/05/196977.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Sat, 05 Jan 2013 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/05/196977.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196977.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/05/196977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 回顾:&nbsp;&nbsp;1.信号的作用&nbsp;&nbsp;2.理解信号:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;软中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可靠与不可靠信号kill -l&nbsp;&nbsp;3.信号发送与注册kill/raise alarm&nbsp; setitimer&nbsp; signal&nbsp;&nbsp;4.信...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/05/196977.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/196977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-05 16:03 <a href="http://www.cppblog.com/mysileng/archive/2013/01/05/196977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day06 笔记(转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/04/196934.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Fri, 04 Jan 2013 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/04/196934.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196934.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/04/196934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196934.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题解答：&nbsp;&nbsp;1.exit(状态码)返回状态码有什么意义?&nbsp;&nbsp;&nbsp;返回值被系统得到.系统根据状态码进行日志记录.&nbsp;&nbsp;&nbsp;返回值被调用者得到：system/wait.程序会根据返回状态码进行对应处理。&nbsp;&nbsp;&nbsp;exit(状态码)=main函数中的return 状态码;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/04/196934.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/196934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-04 10:42 <a href="http://www.cppblog.com/mysileng/archive/2013/01/04/196934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day05 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2013/01/02/196903.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Wed, 02 Jan 2013 03:01:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2013/01/02/196903.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196903.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2013/01/02/196903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196903.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196903.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.IO与文件目录管理&nbsp;1.pread=lseek+read&nbsp;&nbsp;&nbsp;pread读取以后不改变读写位置&nbsp;2.mmap映射：&nbsp;&nbsp;&nbsp;/proc/${pid}/mem 无法映射&nbsp;3.IO的有效用户与实际用户&nbsp;&nbsp;&nbsp;默认情况：实际用户与有效用户一致。&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2013/01/02/196903.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/196903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2013-01-02 11:01 <a href="http://www.cppblog.com/mysileng/archive/2013/01/02/196903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day04 笔记(转)</title><link>http://www.cppblog.com/mysileng/archive/2012/12/31/196876.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 31 Dec 2012 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2012/12/31/196876.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196876.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2012/12/31/196876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196876.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.IO与文件映射&nbsp;1.IO的共享与效率&nbsp;&nbsp;read与write其中数据缓冲的大小&nbsp;&nbsp;读取数据的缓冲大小：getpagesize。&nbsp;&nbsp;2.定位与定位读取(随机读取)&nbsp;&nbsp;read与write在操作的时候，自动移动读取位置.&nbsp;&nbsp;lseek改变读取位置.&nbsp;&nbsp;pread/pwr...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2012/12/31/196876.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/196876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2012-12-31 15:30 <a href="http://www.cppblog.com/mysileng/archive/2012/12/31/196876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day03 笔记(转)</title><link>http://www.cppblog.com/mysileng/archive/2012/12/30/196857.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Sun, 30 Dec 2012 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2012/12/30/196857.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196857.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2012/12/30/196857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196857.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196857.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">一、make与makefile<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.回顾：<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;目标的语法<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;目标名：依赖目标<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@命令<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@命令<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;make的命令行使用<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make -f make脚本文件&nbsp; 目标名<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;2.目标的划分<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;目标依赖</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;&nbsp;3.默认规则：<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;a.不指定目标，执行第一个目标<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;b.不指定make文件，默认文件是makefile Makefile<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;makefile优先<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;4.目标的调用规则：(make把目标当成当前文件夹下同名的文件)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;make执行目标：<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;搜索与目标相同的文件<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果文件存在，则判定文件是否被修改过。<br style="margin: 0px; padding: 0px;" />&nbsp; &nbsp; &nbsp; 文件未被修改，则停止执行，输出提示<br style="margin: 0px; padding: 0px;" />&nbsp; &nbsp; &nbsp; 文件修改过，则进行执行。（文件不存在属于被修改过范畴）</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比较：当前目标与依赖目标<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;5.建议：<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">只要有文件输出，就把任务作为一个目标,并且把输出的文件作为目标名。</span><br style="margin: 0px; padding: 0px;" />&nbsp; &nbsp; 范例：<br />&nbsp; &nbsp; input.o:input.c<br />&nbsp; &nbsp; &nbsp; &nbsp;gcc -c -fpic input.c<br />&nbsp; &nbsp; libdemo.so:input.o<br />&nbsp; &nbsp; &nbsp; &nbsp;gcc -shared -olibdemo.so input.o<br />&nbsp; &nbsp; demo:libdemo.so demo.c<br />&nbsp; &nbsp; &nbsp; &nbsp;gcc demo.c -ldemo -L. -odemo<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;<br />&nbsp; 6.潜规则(不建议)<br style="margin: 0px; padding: 0px;" />&nbsp; &nbsp; 适用于:.c目标与.o目标。<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;查找.o目标，目标不存在，就把.o替换成.c<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;如果.c存在，实施潜规则：直接调用gcc把.c执为.o<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;7.变量<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;变量名=值 值<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;$(变量名)&nbsp; ${变量}&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;8.伪目标:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;不把目标作为文件处理的目标称为伪目标<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;声明伪目标<br />&nbsp; &nbsp; .PHONY=目标 &nbsp;<br /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">二、环境变量<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.使用main的参数<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;int main(int args,char *argv[],char **arge)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;{<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;}<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;命令行参数argv与环境行arge都是字符串数组.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;约定:最后一个字符串是NULL/0<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;2.在C的标准库提供:外部变量<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;extern char **environ;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**environ;<br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #008000; ">/*</span><span style="color: #008000; ">int&nbsp;args,char&nbsp;*argv[],char*arge[]</span><span style="color: #008000; ">*/</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;while(*arge)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",*arge);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arge++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(arge[i])<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",arge[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(*environ)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",*environ);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;environ++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><span style="font-size: 13px;">3.修改获取某个环境变量</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;getenv/setenv/unsetenv</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*val;<br />&nbsp;&nbsp;&nbsp;&nbsp;val=getenv("PATH");<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",val);<br />}</div><span style="font-size: 13px;">三、IO的基础</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;1.认识内核对象</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;不允许访问内核设备和内存,但可以通过内核系统函数去访问.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;对每个内核对象进行编号ID.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;如果访问内核对象,只能通过ID.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;编程模型:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;申请得到一个ID</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在内核系统函数中使用ID得到对应内核对象数据</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;2.怎么访问文件</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;使用函数,传递一个文件,系统打开文件,加载文件数据,</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;返回一个ID.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;使用函数,传递ID,得到数据.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;使用函数传递ID,告诉系统释放文件.</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;ID:文件描述符号.file description (fd)</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;每个程序执行的时候都有一个目录,存放打开的文件描述符号</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;3.每个程序默认打开三个文件设备:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;0:标准输入</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;1:标准输出</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;2:错误输出</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;4.操作文件描述符号</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;ssize_t write(int fd,</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *buf,//要写入内核对象的数据</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t size);//写入数据大小</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;返回:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;0 实际写入的数据</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 写入错误&nbsp;</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;ssize_t read(int fd,</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *buf,//返回数据的空间</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t size);//空间大小</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;返回:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;0:实际读取的数据</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0:碰到文件结束符号EOF (ctrl+d)</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1:读取错误</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;建议:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:输入</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:输出</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:错误输出</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">课堂练习:</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;1.使用write向0 1 2 写数据</span><br style="margin: 0px; padding: 0px; font-size: 13px;" /><span style="font-size: 13px;">&nbsp;&nbsp;2.使用read从0 1 读取数据,并判定输入的情况,然后根据相应的结果输出提示<br /></span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%d\n",getpid());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">while(1);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;r=write(0,"Hello\n",6);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(1,"world\n",6);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(2,"louis\n",6);<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a=20;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;write(1,&amp;a,4);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[32];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">memset(buf,0,32);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;bzero(buf,32);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;r=read(0,buf,30);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("实际输入:%d\n",r);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r&gt;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[r]=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("::%s\n",buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ctrl+d\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r==-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("输入错误!\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">三.基于文件的描述符号<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.得到文件描述符号/释放文件描述符号<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;a.文件类型<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;目录文件d<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;普通文件f<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;字符设备文件c<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;块设备文件b<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;软连接文件l<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;管道文件p<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;socket文件s&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;b.文件的属性<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.属性的表达方式:绝对模式（0666类似的八进制数）,字符模式（rwx）<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拥有者&nbsp;&nbsp; 组&nbsp;&nbsp; 其他用户<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0666<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.文件的权限属性:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;粘附位权限<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户设置位权限<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组设置位权限<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特殊权限&nbsp;&nbsp;&nbsp;Owner&nbsp; group&nbsp; 其他用户</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1.&nbsp; s设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:组设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4:用户设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s对执行有效<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无效的设置位使用S表示<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置位向其他用户开放拥有者权限的权限.用户设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置位向其他用户开放组用户权限的权限.组用户设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置位只对执行程序有意义(执行权限有意义)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2.&nbsp; t设置位<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:表示沾附位设置<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t对写文件有意义<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没有执行权限的沾附位使用T表示.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;沾附的目的:防止有些权限的用户删除文件.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序在执行的时候到底拥有的是执行者用户的权限<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还是文件拥有者的权限.(看setUID)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序执行中有两个用户:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际用户：标示进程到底是谁<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有效用户：标示进程访问资源的权限<br />&nbsp; &nbsp; &nbsp; &nbsp;上述一般情况是一样的，有时候被setUID改变 &nbsp; &nbsp; &nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;总结:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;沾附位的作用:&nbsp;防止其他有写权限用户删除文件<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置位的作用: 向其他执行者开发组或者用户的权限.<br style="margin: 0px; padding: 0px;" />练习:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.使用cat创建一个文件<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;2.设置沾附位,并观察属性<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;3.设置用户设置位,&nbsp;并观察属性<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;4.设置组设置位,&nbsp;并观察属性<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;5.考虑w权限与沾附位的关系<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;6.考虑x权限与设置位的关系.</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;&nbsp;2.通过文件描述符号读写各种数据.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;open函数与creat函数</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*filename,<span style="color: #008000; ">//</span><span style="color: #008000; ">文件名</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;flags,<span style="color: #008000; ">//</span><span style="color: #008000; ">open的方式[创建/打开]</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode_t&nbsp;mode<span style="color: #008000; ">//</span><span style="color: #008000; ">权限(只有创建的时候有效)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;返回:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;=0:内核文件描述符号.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=-1:打开/创建失败<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;open的方式:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;必选方式:O_RDONLY O_WRONLY O_RDWR,必须选择一个<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建/打开:O_CREAT<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可选方式:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对打开可选方式:O_APPEND&nbsp; O_TRUNC(清空数据)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对创建可选方式:O_EXCL<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR|O_CREAT<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR|O_CREAT | O_EXCL&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR|O_APPEND<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR|O_TRUNC<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;权限:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建议使用8进制数<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;关闭&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp; close(int fd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">案例1:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;创建文件<br style="margin: 0px; padding: 0px;" />案例2:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;创建文件并写入数据<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;short float<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;tom &nbsp;20&nbsp; &nbsp;99.99<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;bush &nbsp;70&nbsp; &nbsp;65.00<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;达内&nbsp; 40&nbsp; &nbsp;100.00<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;注意:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;文件的创建的权限受系统的权限屏蔽的影响<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;umask &nbsp;&nbsp;&nbsp;//显示屏蔽权限.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;umask 0666 &nbsp;//设置权限屏蔽.&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;ulimit -a 显示所有的其他限制.<span style="background-color: #eeeeee; font-size: 13px;">&nbsp;</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">创建文件</span><span style="color: #008000; ">*/</span><br />#include&nbsp;&lt;fcntl.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;name[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">short</span>&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;score;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd=open("test.dat",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O_RDWR|O_CREAT|O_EXCL,<br />);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(fd==-1)&nbsp;printf("open&nbsp;error:%m\n"),exit(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">写第一条</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(name,"tom",strlen("tom")+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;age=20;<br />&nbsp;&nbsp;&nbsp;&nbsp;score=99.99;<br />&nbsp;&nbsp;&nbsp;&nbsp;sex='F';<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,name,<span style="color: #0000FF; ">sizeof</span>(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;age,<span style="color: #0000FF; ">sizeof</span>&nbsp;age);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;score,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">float</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;sex,<span style="color: #0000FF; ">sizeof</span>(sex));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">写第二条</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(name,"Bush",strlen("Bush")+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;age=70;<br />&nbsp;&nbsp;&nbsp;&nbsp;score=65.00;<br />&nbsp;&nbsp;&nbsp;&nbsp;sex='M';<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,name,<span style="color: #0000FF; ">sizeof</span>(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;age,<span style="color: #0000FF; ">sizeof</span>&nbsp;age);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;score,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">float</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;sex,<span style="color: #0000FF; ">sizeof</span>(sex));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">写第三条</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(name,"达内",strlen("达内")+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;age=10;<br />&nbsp;&nbsp;&nbsp;&nbsp;score=99.00;<br />&nbsp;&nbsp;&nbsp;&nbsp;sex='F';<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,name,<span style="color: #0000FF; ">sizeof</span>(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;age,<span style="color: #0000FF; ">sizeof</span>&nbsp;age);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;score,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">float</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&amp;sex,<span style="color: #0000FF; ">sizeof</span>(sex));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />}</div><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">案例3:</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;打开文件读取数据</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;重点:</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;怎么打开读取</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;文件尾的判定</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;基本类型的数据读写.<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">#include&nbsp;&lt;fcntl.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;name[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">short</span>&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;score;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;r;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd=open("test.dat",O_RDONLY);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(fd==-1)&nbsp;printf("open&nbsp;error:%m\n"),exit(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=read(fd,name,<span style="color: #0000FF; ">sizeof</span>(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r==0)&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=read(fd,&amp;age,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">short</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=read(fd,&amp;score,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">float</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=read(fd,&amp;sex,<span style="color: #0000FF; ">sizeof</span>(sex));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s,\t%4hd,\t%.2f,\t%1c\n",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name,age,score,sex);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />}</div><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">案例4:</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;结构体读取</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;描述:从键盘读取若干条数据,保存到文件</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据追加</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->View&nbsp;Code&nbsp;<br /><br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;fcntl.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #0000FF; ">struct</span>&nbsp;stu<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;no;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;name[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;score;<br />};<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />.判定文件是否存在,存在打开，不存在创建<br />.输入记录<br />.保存记录<br />.提示继续输入<br />.继续/不继续<br />.关闭文件<br /></span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;openfile(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*filename)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd=open(filename,O_RDWR|O_CREAT|O_EXCL,0666);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(fd==-1)<span style="color: #008000; ">//</span><span style="color: #008000; ">表示文件存在,则打开</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd=open(filename,O_RDWR|O_APPEND);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fd;<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;input(<span style="color: #0000FF; ">struct</span>&nbsp;stu&nbsp;*record)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(record,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;stu));<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("输入学号:");<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&amp;(record-&gt;no));<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("输入姓名:");<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",record-&gt;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("输入成绩:");<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%f",&amp;(record-&gt;score));<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;save(<span style="color: #0000FF; ">int</span>&nbsp;fd,<span style="color: #0000FF; ">struct</span>&nbsp;stu&nbsp;*record)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,record,<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;stu));<br />}<br /><span style="color: #0000FF; ">int</span>&nbsp;iscontinue()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("是否继续输入:\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">fflush(stdin);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">fflush(stdout);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;scanf("\n%c",&amp;c);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c=='Y'&nbsp;||&nbsp;c=='y')<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;r;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;stu&nbsp;s={0};<br />&nbsp;&nbsp;&nbsp;&nbsp;fd=openfile("stu.dat");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(fd==-1)&nbsp;printf("openfile:%m\n"),exit(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(&amp;s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;save(fd,&amp;s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=iscontinue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r==0)&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system("clear");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("输入完毕!\n");&nbsp;&nbsp;&nbsp;&nbsp;<br />}</div><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">3.文件描述符号与重定向</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.判定文件描述符号与终端的邦定关系</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int isatty(int fd)</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回非0:fd输出终端</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:fd输出被重定向</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.防止重定向</span><br style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;" /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #fefef2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/dev/tty</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;fcntl.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("Hello\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;write(1,"World\n",6);<br />&nbsp;&nbsp;&nbsp;&nbsp;fd=open("/dev/tty",O_WRONLY);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(isatty(1))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(1,"notredir\n",9);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(1,"redir\n",6);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;write(fd,"Killer\n",7);<br />}</div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">总结:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.make的多目标依赖规则以及伪目标<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;2.文件的创建与打开(了解设置位的作用)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;3.文件的读写(字符串/基本类型/结构体)<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;4.了解描述符号与重定向</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 19px; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">作业:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;1.完成上课的练习.<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;2.写一个程序使用结构体读取1种的数据,<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并全部打印数据,<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并打印平均成绩<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;3.写一个程序:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;查询1种的数据.比如:输入姓名,查询成绩<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;4.写一个程序,录入保存如下数据:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;书名&nbsp; 出版社&nbsp; 价格&nbsp; 存储量&nbsp; 作者&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;5.写一个程序负责文件拷贝<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;main 存在的文件&nbsp; 新的文件名<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;要求:<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件存在就拷贝,不存在提示错误.</p><p>&nbsp;</p><img src ="http://www.cppblog.com/mysileng/aggbug/196857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2012-12-30 16:39 <a href="http://www.cppblog.com/mysileng/archive/2012/12/30/196857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day02 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2012/12/27/196708.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Thu, 27 Dec 2012 05:27:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2012/12/27/196708.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196708.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2012/12/27/196708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196708.html</trackback:ping><description><![CDATA[brk/sbrk<br />维护一个位置。 brk/sbrk改变这个位置。<br />brk改变绝对位置<br />sbrk改变相对位置<br /> <br />昨天的补充：<br />永远记住：C的基本类型就那几种。<br />所有全新类型都是使用typedef重新定义的。<br />类型重定义的好处：<br />1. 维护方便<br />2. 便于移植（每个系统中都用同一个名，不用修改）<br />3. 容易理解<br /> <br />一、 映射虚拟内存<br />没有任何额外维护数据的内存分配 mmap/munmap<br />1. 函数说明：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">void</span>&nbsp;*mmap(<br /><span style="color: #0000FF; ">void</span>&nbsp;*start,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">指定映射的虚拟地址，如果为0，则由系统指定开始位置</span><span style="color: #008000; "><br /></span>size_t&nbsp;length,<span style="color: #008000; ">//</span><span style="color: #008000; ">指定映射空间的大小。&nbsp;pagesize的倍数</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;prot,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">映射的权限&nbsp;PROT_NONE&nbsp;PROT_READ&nbsp;PROT_WRITE&nbsp;PROT_WRITE&nbsp;PROT_EXEC</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;flags,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">映射的方式</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;fd,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">文件描述符号</span><span style="color: #008000; "><br /></span>offset_t&nbsp;off&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">文件中的映射开始位置（必须是0或pagesezi的倍数）</span><span style="color: #008000; "><br /></span>);</div><br />关于映射的方式flags：<br />内存映射：又叫匿名映射，最后两个参数无效<br />文件映射：映射到某个文件<br />只有文件映射，最后两个参数才有效<br />MAP_ANONYMOUS:内存映射<br />MAP_SHAREDMAP_PRIVATE：二选一，文件映射<br /> <br />2. 案例：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;sys/mman.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br /><span style="color: #0000FF; ">int</span>&nbsp;*p&nbsp;=&nbsp;mmap(<br />NULL,<br />getpagesize(),<br />PROT_READ|PROT_WRITE,<br />MAP_ANONYMOUS|MAP_SHARED,<br />0,<br />0);<br />*P&nbsp;=&nbsp;20;<br />*(p+1)&nbsp;=&nbsp;30;<br />*(p+2)&nbsp;=&nbsp;40;<br />printf("%d\n",&nbsp;p[2]);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">打印出40</span><span style="color: #008000; "><br /></span>munmap(p,&nbsp;4096);<br />}</div>  3. 总结：<br />  选择什么样的内存管理方法？<br />  STL<br />  new<br />  <br />  malloc小而多的数据<br />  brk/sbrk同类型的大块数据，动态移动指针<br />  mmap/munmap 控制内存的访问/使用文件映射/控制内存共享<br /> <br />二、编程工具与动态库<br />1. gcc<br />2. make<br />3. gdb<br />4. 其他工具<br />5. 动态库（共享库）<br /> <br />1. gcc<br />&nbsp; &nbsp; -o 输出文件名<br />&nbsp; &nbsp; -O-O1-O2-O3//编译优化<br />&nbsp; &nbsp; -g-g1-g2-g3//产生调试信息&nbsp;<br />&nbsp; &nbsp; -Wallerror//-Wall 显示所有警告-Werror 将警告当成错误提示<br />&nbsp; &nbsp; -w//关闭所有警告<br />&nbsp; &nbsp; -c//只编译不连接，产生 .o文件（目标文件）<br />&nbsp; &nbsp; -E//预编译<br />&nbsp; &nbsp; -S//汇编。 产生 .s文件（汇编文件）<br /> <br /><span style="color: red;">编译4过程是 -E(产生.i) -c(产生.o) -S(产生.s) 自动调用连接器</span><span style="color: red;">ld</span><br /> <br />&nbsp; &nbsp; -D//在命令行定义宏 （宏可以在代码中定义，也可以在命令行上定义）<br />&nbsp; &nbsp; -x//指定编译的语言类型 C, C++, .S(汇编)， none（自动判定）<br />&nbsp; &nbsp; -std=c89 &nbsp;使用标准C89<br />&nbsp; &nbsp; -std=c99 &nbsp;使用标准C99<br /> <br />三、 静态库的编译<br />1. 编译过程 （*.a） a是achieve的缩写<br />&nbsp; 1.1 编译成目标文件<br />&nbsp; &nbsp; -static 可选<br />&nbsp; &nbsp; gcc -c -static 代码文件.c &nbsp;//生产可用于归档的目标代码:代码文件.0<br />&nbsp; 1.2 归档成静态库<br />&nbsp; &nbsp; ar工具 （常用-r -t选项）<br />&nbsp; &nbsp; ar -r 静态库 被归档的文件名(上一步代码文件.o)&nbsp;<br />&nbsp; &nbsp; ar -r add.a add.o<br />&nbsp; &nbsp; nm工具（查看库中所蕴含的函数列表）<br />&nbsp; &nbsp; nm 静态库或动态库或目标文件或执行文件<br />&nbsp; 1.3 使用静态库<br />&nbsp; &nbsp; gcc 代码文件 静态库<br />小例子：<br />使用静态库完成如下程序<br />输入一个菱形半径，打印菱形<br />输入整型封装成IOTool<br />菱形打印封装成Graphic<br />计划：<br />1. 实现输入<br />2. 实现菱形<br />3. 编译静态库<br />4. 调用静态库<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #008000;">//</span><span style="color: #008000; ">iotool.c</span><span style="color: #008000; "><br /></span>#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #0000FF; ">int</span>&nbsp;inputInt(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*info)<br />{<br /><span style="color: #0000FF; ">int</span>&nbsp;r;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">返回值</span><span style="color: #008000; "><br /></span>printf("%s:",&nbsp;info);<br />scanf("%d",&nbsp;&amp;r);<br /><span style="color: #0000FF; ">return</span>&nbsp;r;<br />}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">graphic.c</span><span style="color: #008000; "><br /></span>#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #0000FF; ">void</span>&nbsp;diamond(<span style="color: #0000FF; ">int</span>&nbsp;r)<br />{<br /><span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;y;<br /><span style="color: #0000FF; ">for</span>(y=0;&nbsp;y&lt;=2*r;&nbsp;y++)<br />{<br /><span style="color: #0000FF; ">for</span>(x=0;&nbsp;x&lt;=2*r;&nbsp;x++)<br />{<br /><span style="color: #0000FF; ">if</span>(y&nbsp;==&nbsp;x+r&nbsp;||&nbsp;y&nbsp;==&nbsp;x-r&nbsp;||y&nbsp;==&nbsp;-x+r&nbsp;||&nbsp;y&nbsp;==&nbsp;-x+3*r)<br />{<br />printf("*");<br />}<br /><span style="color: #0000FF; ">else</span><br />{<br />printf("&nbsp;");<br />}<br />}<br />printf("\n");<br /><br />}<br />}</div><br />编译： gcc -c -static iotool.c<br /><br />gcc -c -static graphic.c<br />ar -r demo1.a iotool.o graphic.o<br />ar -t demo1.a //相当于nm demo1.a<br /> <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">main.c</span><span style="color: #008000; "><br /></span>main()<br />{<br /><span style="color: #0000FF; ">int</span>&nbsp;r&nbsp;=&nbsp;inputInt("输入菱形半径：");<br />diamond(r);<br />}</div><br />编译: gcc main.c demo1.a -o main<br /><br />执行：./main<br />把静态库作为代码的一部分来编译<br /> <br />总结：<br />1. 什么是库？<br />函数等代码封装的二进制已经编译的归档文件<br />2. ar归档工具<br />3. 采用库的方式管理代码优点：<br />容易组织代码<br />复用<br />保护代码版权<br />4. 静态库的&#8220;静态&#8221;的含义：<br />编译好的程序运行的时候不依赖库<br />库作为程序的一部分编译连接<br /><span style="color: red;">5. 静态库的本质</span><br /><span style="color: red;">就是目标文件的集合（归档）</span><br />6. -static可选<br /> <br />2. 库的规范与约定<br />库命名规则：<br />lib库名.a.主版本号.副版本号.批号<br />一般就写&#8220;lib库名.a&#8221;就行了。<br />ar -r libdemo2.a iotool.o graphic.o<br />库的使用规则<br />-l库名<br />-L库所在的目录<br />gcc main.c -o main -l demo2 -L.<br /> <br />四、 动态库的编译<br />1. 什么是动态库（共享库）<br />动态库是可以执行的，静态库不能执行<br />但动态库没有main，不能独立执行<br />动态库不会连接成程序的一部分<br />程序执行时，必须需要动态库文件<br />2. 工具<br />ldd查看程序需要调用的动态库 ，ldd只能查看可执行文件（共享库文件或elf文件）<br />nm （查看库中的函数符号）<br />3. 动态库的编译<br />3.1编译<br />-c -f pic(可选) (-f 指定文件格式 pic 位置无关代码)<br />3.2 连接<br />-shared<br /> <br />编译：gcc -c -fpic iotool.c<br />gcc -c -fpic graphic.c<br />(非标准)gcc -shared -odemo3.so iotool.o graphic.o<br />(标准)gcc -shared -olibdemo4.so iotool.o graphic.o<br />4. 使用动态库<br />gcc 代码文件名 动态库文件名<br />gcc 代码文件名 -l库名 -L动态库所在的路径<br />gcc main.c -ldemo4 -L. -o main<br /> <br />标准命名规则：<br />lib库名.so<br />lib库名.a<br /> <br />问题：<br />4.1 执行程序怎么加载动态库？<br />4.2 动态库没有作为执行程序的一部分，为什么连接需要制定动态库及目录？<br />因为连接器需要确认函数在动态库中的位置<br />动态库的加载：<br />1. 找到动态库<br />2. 加载动态库到内存（系统实现）<br />3. 映射到用户的内存空间（系统实现）<br />动态库查找规则：<br />/lib<br />/user/lib<br />LD_LIBRARY_PATH环境变量指定的路径中找<br />设置当前路径为环境变量：（<span style="color: red;">自己定义的库最好设置好目录，或者放到上述公共目录）</span><br />export LD_LIBRARY_PATH=.:~:..:~Walle<br />缓冲机制：<br />系统把lib:/user/lib:LD_LIBRARY_PATH里的文件加载到缓冲<br />/sbin/ldconfig -v 刷新缓冲so中的搜索库的路径<br />小练习：<br />输入两个数，计算两个数的和。<br />要求：输入与计算两个数的和封装成动态库调用<br /> <br />五、 使用libdl.so库<br />动态库加载原理<br />动态库中函数的查找已经封装成哭libdl.so<br />libdl.so里面有4个函数：<br />dlopen//打开一个动态库<br />dlsym//在打开的动态库里找一个函数<br />dlclose//关闭动态库<br />dlerror//返回错误<br /> <br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">dldemo.c</span><span style="color: #008000; "><br /></span>#include&nbsp;&lt;dlfcn.h&gt;<br />main()<br />{<br /><span style="color: #0000FF; ">void</span>&nbsp;*handle&nbsp;=&nbsp;dlopen("./libdemo4.so",&nbsp;RTLD_LAZY);<br /><span style="color: #0000FF; ">void</span>&nbsp;(*fun)(<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;dlsym(handle,&nbsp;"diamond");<br />fun(5);<br />dlclose(handle);<br />}</div>  gcc dldemo.c -o main -ldl<br /><br />  ldd main<br />  ./main<br />  <br />  总结：<br />  1. 编译连接动态库<br />  2. 使用动态库<br />  3. 怎么配置让程序调用动态库<br />  4. 掌握某些工具的使用 nm ldd lddconfig objdump strit(去掉多余的信息)<br /> <br />六、 工具make的使用与makefile脚本<br />背景：<br />make编译脚本解释<br />编译脚本makefile<br />make -f 脚本文件 目标<br />脚本文件：<br />1. 文本文件  （例如 demo.mk）<br />2. 基本构成语法<br />基本单位目标target<br />目标名：依赖目标<br />\t目标指令<br />\t目标指令<br /> <br />//demo.mk<br />demo:iotool.c graphic.c main.c<br />    gcc iotool.c -c<br />    gcc graphic.c -c<br />    gcc iotool.o graphic.o -shared -o libdemo.so<br />    gcc main.c -ldemo -L. -o main<br />make -f demo.mk demo 会生产main可执行文件<img src ="http://www.cppblog.com/mysileng/aggbug/196708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2012-12-27 13:27 <a href="http://www.cppblog.com/mysileng/archive/2012/12/27/196708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux高级编程day01 笔记 (转)</title><link>http://www.cppblog.com/mysileng/archive/2012/12/26/196698.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Wed, 26 Dec 2012 11:55:00 GMT</pubDate><guid>http://www.cppblog.com/mysileng/archive/2012/12/26/196698.html</guid><wfw:comment>http://www.cppblog.com/mysileng/comments/196698.html</wfw:comment><comments>http://www.cppblog.com/mysileng/archive/2012/12/26/196698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mysileng/comments/commentRss/196698.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mysileng/services/trackbacks/196698.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.malloc怎么分配空间　　　　malloc与new的关系　　　　看完下面的2再回答这个问题。2. linux对内存的结构描述　　　　a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /proc/${pid}/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存放进程运行时候所有的信息。程序一结...&nbsp;&nbsp;<a href='http://www.cppblog.com/mysileng/archive/2012/12/26/196698.html'>阅读全文</a><img src ="http://www.cppblog.com/mysileng/aggbug/196698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mysileng/" target="_blank">鑫龙</a> 2012-12-26 19:55 <a href="http://www.cppblog.com/mysileng/archive/2012/12/26/196698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>