﻿<?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++博客-夫为剑者-文章分类-学习笔记</title><link>http://www.cppblog.com/vivip/category/2360.html</link><description>示之以虚 开之以利 后之以发 先之以至</description><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 03:52:35 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 03:52:35 GMT</pubDate><ttl>60</ttl><item><title>shell 脚本--------命令</title><link>http://www.cppblog.com/vivip/articles/3312.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Fri, 17 Feb 2006 08:22:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/3312.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/3312.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/3312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/3312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/3312.html</trackback:ping><description><![CDATA[<font size=2>
<P>shell 脚本</P>
<P>命令</P>
<P>1.break<BR>&nbsp; 从循环中退出，可以加个参数代表退出的循环嵌套层数</P>
<P>2.:<BR>&nbsp; 空命令，偶尔被用来简化逻辑条件，如 while ：相当于 while true</P>
<P>3.continue<BR>&nbsp; 和c语言中差不多</P>
<P><BR>4..<BR>&nbsp; 执行当前 shell 中的某个命令</P>
<P>5.echo<BR>&nbsp; 输出字符串</P>
<P>6.eval<BR>&nbsp; 得到变量值的值<BR>ex：foo=10<BR>&nbsp;&nbsp;&nbsp; x=foo<BR>&nbsp;&nbsp;&nbsp; y='$'$x<BR>&nbsp;&nbsp;&nbsp; echo $y&nbsp; //$foo<BR>&nbsp;&nbsp;&nbsp; eval y='$'$x<BR>&nbsp;&nbsp;&nbsp; echo $y&nbsp; //10</P>
<P>7.exec<BR>&nbsp; 以另一个不同的程序替换当前shell<BR>ex：exec wall "ddasd"&nbsp; //以wall命令替换掉当前shell，exec语句后面的其他代码都不会执行了<BR>&nbsp; 修改当前文件的描述符</P>
<P>8.exit n<BR>&nbsp; 退出程序</P>
<P>9.export<BR>&nbsp; 导入变量到shell</P>
<P>10.expr<BR>&nbsp;&nbsp; 把参数作为表达式进行算术求值<BR>&nbsp;&nbsp; expr1 | expr2&nbsp;如果expr1非0则等于expr1，否则等于expr2<BR>&nbsp;&nbsp; expr1 &amp; expr2&nbsp;如果两个表达式都是0则等于0，否则等于expr1<BR>&nbsp;&nbsp; expr1 = expr2&nbsp;相等<BR>&nbsp;&nbsp; expr1 &gt; expr2&nbsp;大于<BR>&nbsp;&nbsp; expr1 &gt;=expr2&nbsp;大于或等于<BR>&nbsp;&nbsp; expr1 &lt; expr2&nbsp;小于<BR>&nbsp;&nbsp; expr1 &lt;=expr2&nbsp;小于或等于<BR>&nbsp;&nbsp; expr1 !=expr2&nbsp;不等于<BR>&nbsp;&nbsp; expr1 + expr2&nbsp;加法<BR>&nbsp;&nbsp; expr1 - expr2&nbsp;减法<BR>&nbsp;&nbsp; expr1 * expr2&nbsp;乘法<BR>&nbsp;&nbsp; expr1 / expr2&nbsp;整数除法<BR>&nbsp;&nbsp; expr1 % expr2&nbsp;取余</P>
<P>11.printf<BR>&nbsp;&nbsp; printf "format string" parameter1 parameter2 ……</P>
<P>12.return</P>
<P>13.set<BR>&nbsp;&nbsp; 为shell设定参数变量</P>
<P>14.shift<BR>&nbsp;&nbsp; 把所有参数变量移动一个位置即$3成为$2,$2成为$1,$1被丢弃， 但$0仍保持不变</P>
<P>15.trap<BR>&nbsp;&nbsp; trap command signal<BR>&nbsp;&nbsp; 用来指定在接受到操作系统信号后将要采取的行动</P>
<P>16.unset<BR>&nbsp;&nbsp; 从环境变量中删除变量或函数<BR></P>
</font><img src ="http://www.cppblog.com/vivip/aggbug/3312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2006-02-17 16:22 <a href="http://www.cppblog.com/vivip/articles/3312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 脚本--------控制语句</title><link>http://www.cppblog.com/vivip/articles/3303.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Fri, 17 Feb 2006 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/3303.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/3303.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/3303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/3303.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/3303.html</trackback:ping><description><![CDATA[<font size=2><P>shell 脚本</P>
<P>控制语句</P>
<P>1.if<BR>&nbsp; if condition<BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; then<BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; elif<BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; fi</P>
<P>2.for<BR>&nbsp; for variable in values<BR>&nbsp; do<BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; done</P>
<P>3.while<BR>&nbsp; while conditoin<BR>&nbsp; do<BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; done</P>
<P>4.until<BR>&nbsp; until condition<BR>&nbsp; do <BR>&nbsp;&nbsp;&nbsp;&nbsp; statements<BR>&nbsp; done</P>
<P>5.case<BR>&nbsp; case variable in<BR>&nbsp; pattern | pattern | pattern……) statements<BR>&nbsp; pattern | pattern | pattern……) statements<BR>&nbsp; ……<BR>&nbsp; esac</P>
<P>6.and <BR>&nbsp; statements &amp;&amp; statements &amp;&amp; statements ……<BR>&nbsp; 从左开始执行命令，如果执行结果为true则继续执行，为false则返回</P>
<P>7.or<BR>&nbsp; statements || statements || statements ……<BR>&nbsp; 从左开始执行命令，如果执行结果为false则继续执行，为true则返回</P></font><img src ="http://www.cppblog.com/vivip/aggbug/3303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2006-02-17 10:09 <a href="http://www.cppblog.com/vivip/articles/3303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 脚本--------用test命令进行比较的条件</title><link>http://www.cppblog.com/vivip/articles/3283.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Thu, 16 Feb 2006 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/3283.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/3283.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/3283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/3283.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/3283.html</trackback:ping><description><![CDATA[<font size=2><P>shell 脚本</P>
<P>用test命令进行比较的条件<BR>1.字符串比较<BR>string1=string2&nbsp;&nbsp;相等为真<BR>string1!=string2&nbsp;不等为真<BR>-n string&nbsp;&nbsp;长度&gt;0为真<BR>-z string&nbsp;&nbsp;长度=0为真</P>
<P>2.算术比较<BR>expression1 -eq expression2&nbsp;相等为真<BR>expression1 -ne&nbsp;expression2&nbsp;不等为真<BR>expression1 -gt expression2&nbsp;前&gt;后为真<BR>expression1 -ge expression2&nbsp;前&gt;=后为真<BR>expression1 -lt expression2&nbsp;前&lt;后为真<BR>expression1 -le expression2&nbsp;前&lt;=后为真<BR>!expression</P>
<P>3.与文件有关的条件测试<BR>-d file&nbsp;如果文件是一个子目录则为真<BR>-e file&nbsp;文件存在为真<BR>-f file&nbsp;文件是普通文件为真<BR>-g file 文件的set-group-id属性位被设置则为真<BR>-r file 文件可读则为真<BR>-s file 文件长度不为0则为真<BR>-u file 文件的set-user-id属性位被设置则为真<BR>-w file 文件可写则为真<BR>-x file 文件可执行则为真</P></font><img src ="http://www.cppblog.com/vivip/aggbug/3283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2006-02-16 11:26 <a href="http://www.cppblog.com/vivip/articles/3283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------信号及其处理</title><link>http://www.cppblog.com/vivip/articles/1696.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Mon, 12 Dec 2005 07:08:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1696.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1696.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1696.html</trackback:ping><description><![CDATA[<font size=2>建立连接<BR>#include &lt;signal.h&gt;<BR>void (*signal(int signumber,void (*func)(int)))(int);<BR>正确返回：上一次信号的属性<BR>错误返回：SIGERR<BR>signumber：信号常量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func：1.常数值SIG_IGN，告诉系统忽略此信号（除了SIGKILL和SIGSTOP不能忽略）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.常数值SIG_DFL，采用缺省处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.信号发生时要调用的函数<BR><BR>相关函数<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;signal.h&gt;<BR>int kill(pid_t pid,int signumber);<BR>int raise(int signumber);<BR>对于kill：<BR>pid&gt;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信号将被送给进程号为pid的进程<BR>pid==0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信号将送给与发送信号的进程有相同进程组号的进程，前提是该进程有权限发送<BR>pid&lt;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;信号将被送给进程组号为pid绝对值的所有进程，前提是有权限发送<BR>pid==-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;未定义</FONT><img src ="http://www.cppblog.com/vivip/aggbug/1696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-12 15:08 <a href="http://www.cppblog.com/vivip/articles/1696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------进程的控制</title><link>http://www.cppblog.com/vivip/articles/1634.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Thu, 08 Dec 2005 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1634.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1634.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1634.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1634.html</trackback:ping><description><![CDATA[<FONT size=2>进程之间的关系<BR>进程组<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>pid_t getpgrp();<BR>返回：调用进程的进程组号<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>int setpgid(pid_t pid,pid_t gpid);<BR>成功返回：0；失败：-1；<BR>将标识号为pid的进程的进程组号设为gpid。如果两参数相等，该进程将成为该进程组的进程leader。<BR><BR>session<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>pid_t setsid(void);<BR>如果该进程不是进程leader，这个进程将创建一个新的session，同时完成下面三件事：<BR>1.该进程成为新session的session leader，而且是新session的唯一进程<BR>2.该进程成为新进程组的进程leader，调用进程的进程标识号成为新进程组的组号<BR>3.该进程没有控制终端<BR><BR>tcgetpgrp 和 tcsetpgrp<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>pid_t tcgetpgrp(int filedes);<BR>成功：前台进程组的组号；失败：-1；<BR>int tcsetpgrp(int filedes,pid_t pgrpid);<BR></FONT><img src ="http://www.cppblog.com/vivip/aggbug/1634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-08 17:58 <a href="http://www.cppblog.com/vivip/articles/1634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------文件系统的操作</title><link>http://www.cppblog.com/vivip/articles/1631.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Thu, 08 Dec 2005 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1631.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1631.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1631.html</trackback:ping><description><![CDATA[<FONT size=2>文件共享<BR>一个存在的文件描述符可以用以下函数来复制：<BR>&nbsp;#include &lt;unistd.h&gt;<BR>int dup(int fd);<BR>int dup2(int fd,int fd2);<BR>返回：最小可用的文件描述符<BR>dup调用返回的是可用的文件描述符中最小的，在dup2调用中我们可以用fd2自己定义新的文件描述符。如果fd2已经被使用，它将首先被关闭，如果fd和fd2相同，则返回fd2而不关闭。</FONT><img src ="http://www.cppblog.com/vivip/aggbug/1631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-08 17:00 <a href="http://www.cppblog.com/vivip/articles/1631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------文件系统的操作</title><link>http://www.cppblog.com/vivip/articles/1625.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Thu, 08 Dec 2005 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1625.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1625.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1625.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1625.html</trackback:ping><description><![CDATA[<P><FONT size=2>打开文件以前检验进程是否已经访问过该文件：<BR>#include &lt;unistd.h&gt;<BR>int access(char *pathname,int mode);<BR>正确返回：1<BR>错误返回：0<BR>pathname：希望检验的文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode：包含在unistd.h中的以下值之一<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R_OK&nbsp;&nbsp; --------&nbsp;&nbsp; 进程是否有过读文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; W_OK&nbsp;&nbsp; -------&nbsp;&nbsp; 进程是否有过写文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X_OK&nbsp;&nbsp; --------&nbsp;&nbsp; 进程是否有过执行文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F_OK&nbsp;&nbsp;&nbsp; --------&nbsp;&nbsp; 检验规定的文件是否存在<BR><BR>创建新文件<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;sys/stat.h&gt;<BR>#include &lt;fcntl.h&gt;<BR>int creat(const char* pathname,mode_t mode);<BR>等价于：<BR>open(pathname,O_WRONLY | O_CREAT | O_TRUNC,mode);<BR><BR>读文件<BR>#include &lt;unistd.h&gt;<BR>ssize_t read(int fd,void *buf,size_t nbytes);<BR>正确返回：0或者字节数<BR>错误返回：-1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fd：&nbsp;文件描述符<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf：指向内存块的指针<BR>nbytes：复制到buf中字节个数的计数<BR><BR>写文件<BR>#include &lt;unistd.h&gt;<BR>ssize_t write(int fd,void *buf,size_t nbytes);<BR><BR>关闭文件<BR>#include &lt;unistd.h&gt;<BR>int close(int fd);<BR>正确返回：0<BR>错误返回：-1<BR><BR>随机文件操作<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>off_t lseek(int fd,off_t offset,int whence);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fd：文件描述符<BR>&nbsp;&nbsp; offset：偏移值<BR>whence：下面三个之一<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEEK_SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从文件开始处计算<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEEK_CUR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前位置计算<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEEK_END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件结束处计算<BR>在&lt;sys/types.h&gt;中有定义off_t类型为：typedef&nbsp;&nbsp; long&nbsp;&nbsp; off_t;</FONT></P><img src ="http://www.cppblog.com/vivip/aggbug/1625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-08 13:31 <a href="http://www.cppblog.com/vivip/articles/1625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------文件系统的操作</title><link>http://www.cppblog.com/vivip/articles/1603.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Wed, 07 Dec 2005 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1603.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1603.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1603.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1603.html</trackback:ping><description><![CDATA[<FONT size=2>linux的文件采用的是索引结构，文件存储在不连续的存储块中，这些块的块号记录于索引块中。索引块称为inode结构，inode结构中与用户有关的信息： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode&nbsp;&nbsp; ------&nbsp;&nbsp; 文件的权限及类型<BR>&nbsp; &nbsp;link count&nbsp;&nbsp; ------&nbsp;&nbsp; 包含本inode项的目录个数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user id&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp; 文件所有者的用户id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group id&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp; 文件所有者所在组的id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;文件大小<BR>access time&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;文件上次被访问的时间<BR>&nbsp;&nbsp;&nbsp;&nbsp;mod time&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;文件上次被修改的时间<BR>&nbsp;&nbsp;&nbsp; block list&nbsp;&nbsp; ------&nbsp;&nbsp; 包含文件第一段的磁盘块号列表<BR>indirect list&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;包含文件其它内容(除第一段)的磁盘块号列表<BR><BR>文件类型记录在stat结构中的st_mode域中，可以用以下的宏来决定文件类型，每个宏的参数是stat结构中的st_mode值<BR>S_ISREG()&nbsp;&nbsp; ------&nbsp;&nbsp; 正规文件<BR>S_ISDIR()&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;目录文件<BR>S_ISCHR()&nbsp;------&nbsp;&nbsp;&nbsp; 字符设备文件<BR>S_ISBLK() ------&nbsp;&nbsp;&nbsp; 块设备文件<BR>S_ISFIFO()------&nbsp;&nbsp;&nbsp; 有名管道文件<BR>S_ISLNK()------&nbsp;&nbsp;&nbsp;&nbsp; 符号链接文件<BR>S_ISSOCK()----&nbsp;&nbsp;&nbsp;&nbsp; 套接字文件<BR><BR>顺序文件操作<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开文件：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/stat.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;fcntl.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int open(const char* pathname,int oflag,.../*mode_t mode*/);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正确返回：文件描述符<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误返回：-1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数描述：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pathname：待打开或创建的文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oflag：如何打开文件，必须包含以下三个中的一个<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_RDONLY&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp; 只读方式打开<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_WRONLY&nbsp;------&nbsp;&nbsp;&nbsp; 只写方式打开<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_RDWR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------&nbsp;&nbsp;&nbsp; 读写方式打开<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还可以按位逻辑加（ | ）组合下列标志<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_APPEND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次写文件从文末开始<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_CREAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件不存在则创建，必须带第三个参数mode设置新文件的访问方式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_EXCL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检查文件是否存在，以及不存在时创建文件的情况<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O_TRUNC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果文件存在，而且以只写或读写方式打开，将文件长度截至0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode：如果用open创建文件就要使用，其用来规定文件所以者、用户组、其它用户的访问权限。逻辑加组合下列常量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sys/stat.h&gt;中定义<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IRUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件所有者的读权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IWUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件所有者的写权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IXUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件所有者的执行权限位&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IRGRP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件用户组的读权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IWGRP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件用户组的写权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IXGRP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件用户组的执行权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IROTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件其它用户的读权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IWOTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件其它用户的写权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_IXOTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件其它用户的执行权限位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还可以用下列常量设置set _uid位和set_gid位：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_ISUID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S_ISGID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个进程代表你创建文件时，权限位由该进程相联系的umask值所修改，进程利用如下公式决定文件的实际权限位：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode &amp;(~umask);</FONT><img src ="http://www.cppblog.com/vivip/aggbug/1603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-07 16:10 <a href="http://www.cppblog.com/vivip/articles/1603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------进程的控制</title><link>http://www.cppblog.com/vivip/articles/1586.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Wed, 07 Dec 2005 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1586.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1586.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1586.html</trackback:ping><description><![CDATA[<FONT size=2>exec函数介绍<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个进程调用exec函数执行另一个程序后，这个进程就完全被新程序替代。进程标识号不变，旧进程的其它信息，如：代码段、数据段等均被新进程的替换。新程序从自己的main（）函数开始执行。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execl(const char* pathname,const char* arg(),.../*(char*)0*/);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execv(const char* pathname,char* const argv[ ] );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execle(const char* pathname,const char* arg(),.../*(char*)0,char*const envp[ ]*/);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execve(const char* pathname,char* const argv[ ],char* const envp[ ]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execlp(const char* filename,const char* arg(),.../*(char*)0*/);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int execvp(const char* filename,char* const argv[ ]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误返回-1，正确返回0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以p结尾的表示是以文件名作参数，并在环境变量PATH中查找此文件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以l结尾的表示新程序使用罗列出参数的方式传递的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以v结尾的表示用参数数组的方式为新程序传递参数。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以e结尾的表示根据父进程传递的参数设置子进程的环境变量，而不是拷贝父进程的环境变量。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec调用后，子进程从父进程继承的属性有：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 父进程id、真实的用户id和组id、进程组id、SESSION id、控制终端、定时器剩余时间、根目录和当前目录、文件缺省创建掩码、其它资源分配、进程的时间记录。<BR><BR>结束进程<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit和_exit：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdlib.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void exit(int status);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void _exit(status.h);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zombie：已经结束，但父进程尚未检查其终止状态的进程。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 父进程先于子进程结束，init就自动成为该子进程的父进程。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdlib.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int atexit(void&nbsp;(*func)(void));&nbsp;&nbsp;&nbsp; //逆序调用<BR><BR>改变进程的用户id和组id<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置真实id和有效id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int setuid(uid_t uid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int setgid(gid_t gid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常返回0，错误返回-1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用规则：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.当进程有超级用户权限时，setuid将进程的真实用户id、有效用户id和保存用户id都设成uid；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.当进程没有超级用户特权，但uid等于真实用户id或者保存用户id时，只将有效用户id设成uid；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.返回错误;<BR><BR>交换真实id和有效id<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#include &lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int setreuid(uid_t ruid,uid_t euid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int setregid(gid_t rgid,gid_t egid);<BR><BR>设置有效id<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#include&nbsp;&lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int seteuid(uid_t uid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int setegid(gid_t gid);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><img src ="http://www.cppblog.com/vivip/aggbug/1586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-07 11:19 <a href="http://www.cppblog.com/vivip/articles/1586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux上的c编程笔记-------进程的控制</title><link>http://www.cppblog.com/vivip/articles/1561.html</link><dc:creator>vivip</dc:creator><author>vivip</author><pubDate>Tue, 06 Dec 2005 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/vivip/articles/1561.html</guid><wfw:comment>http://www.cppblog.com/vivip/comments/1561.html</wfw:comment><comments>http://www.cppblog.com/vivip/articles/1561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vivip/comments/commentRss/1561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vivip/services/trackbacks/1561.html</trackback:ping><description><![CDATA[<FONT size=1>调用下列函数取得进程的各种识别号：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid_t getuid(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回真实用户识别号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid_t getpid(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//返回真实组识别号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid_t geteuid(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回有效用户识别号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid_t getepid(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回有效组识别号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t getppid(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回父进程识别号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t getpgrp(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回进程组识别号<BR><BR>进程的创建：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include&lt;unistd.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t fork(void);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正确返回：在父进程中返回子进程的进程号，在子进程中返回0；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误返回：-1；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单调用，双返回的函数。子进程是父进程的拷贝，子进程从父进程那里得到了数据段和堆栈段的拷贝，需要重新分配内存，而不是与父进程共享内存。只读的代码段，以共享内存方式访问。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t vfork(void);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用流程和返回值与fork完全相同。但是vfork并不完全拷贝父进程的数据段，用vfork创建进程的主要目的是用exec函数执行另外的程序。实际上，在没有调用exec函数或者exit函数之前，vfork创建的进程和父进程是共享数据段的。vfork和fork的另一不同是fork对进程执行顺序没有规定，而vfork则是子进程先运行直至调用exec或者exit之后，父进程的执行顺序才没有限制。<BR><BR>进程等待：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当一个进程结束时会产生一个终止状态字，然后内核发出一个SIGCHLD信号通知父进程。因为子进程结束对父进程是异步的，所以这个SIGCHLD信号对父进程也是异步的。父进程可以不响应，也可以调用wait或者waitpia进行处理，缺省不响应。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/types.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/wait.h&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t wait(int *statloc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t waitpid(pid_t pid,int *statloc,int options);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正常情况下返回进程id,错误返回-1，其它返回0；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数statloc是个整型指针，如果不为空的话，子进程的终止状态字就存放在该参数指定的内存位置。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回的这个状态字是个整数，特定位表示特定信息，只需调用sys/wait.h里定义的几个宏就可以得到相关信息。它们是：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIFEXITED(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当子进程正常结束时返回为真<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIFSIGNALED(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当子进程异常结束时返回为真<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WEXITSTATUS(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当WIFEXIDED(status)为真时调用，返回状态字的低八位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WTERMSIG(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当WIFSINGALEN(status)为真时调用，返回引起终止的信号代号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitpid函数参数含义：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-1： 等待进程组id等于pid的绝对值的子进程；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=-1： 等待任何子进程，此时相当于wait；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =0：&nbsp;&nbsp; 等待进程组id与父进程组id相同的子进程；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;0：&nbsp;&nbsp; 等待进程id等于pid的子进程；&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options：&nbsp;&nbsp; 进一步控制waitpid的运行。它可以取0，也可以取常数，也可以取常数组合（用OR连接）。</FONT><img src ="http://www.cppblog.com/vivip/aggbug/1561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vivip/" target="_blank">vivip</a> 2005-12-06 13:50 <a href="http://www.cppblog.com/vivip/articles/1561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>