<code>#include <stdio.h></code>
<code>#include <stdlib.h></code>
<code>#include <unistd.h></code>
<code>int</code> <code>main(</code><code>int</code> <code>argc,</code><code>char</code> <code>const</code> <code>*argv[])</code>
<code>{</code>
<code> </code><code>printf</code><code>(</code><code>"i am process %ld\n"</code><code>, (</code><code>long</code><code>)getpid() );</code>
<code> </code><code>printf</code><code>(</code><code>"my parent is %ld\n"</code><code>, (</code><code>long</code><code>)getppid());</code>
<code> </code><code>return</code> <code>0;</code>
<code>}</code>
上面的例子輸出了程序的id和他的父程序的id
<code> </code><code>printf</code><code>(</code><code>"my real user id is %ld\n"</code><code>, (</code><code>long</code><code>)getuid());</code>
<code> </code><code>printf</code><code>(</code><code>"my effective user id is %ld\n"</code><code>,(</code><code>long</code><code>)geteuid());</code>
<code> </code><code>printf</code><code>(</code><code>"my real group id is %ld\n"</code><code>, (</code><code>long</code><code>)getgid());</code>
<code> </code><code>printf</code><code>(</code><code>"my effective group id is %ld\n"</code><code>,(</code><code>long</code><code>)getegid() );</code>
<code>/*</code>
<code>this program run's result as follows :</code>
<code>my real user id is 1000</code>
<code>my effective user id is 1000</code>
<code>my real group id is 1000</code>
<code>my effective group id is 1000</code>
<code>*/</code>
上面的這個程式列印程序的各種ID群組ID
<code> </code><code>int</code> <code>x;</code>
<code> </code><code>x=0;</code>
<code> </code><code>fork();</code>
<code> </code><code>printf</code><code>(</code><code>"i am process %ld and my x is %d\n"</code><code>, (</code><code>long</code><code>)getpid() ,x);</code>
<code>this program run's result as follows:</code>
<code>i am process 5416 and my x is 0</code>
<code>i am process 5417 and my x is 0</code>
<code>*/</code><code><br><br>簡單的fork的例子</code>
<code> </code><code>pid_t childpid;</code>
<code> </code><code>childpid=fork();</code>
<code> </code><code>if</code><code>(childpid== -1){</code>
<code> </code><code>perror</code><code>(</code><code>"failed to fork\n"</code><code>);</code>
<code> </code><code>return</code> <code>1;</code>
<code> </code><code>}</code>
<code> </code><code>if</code><code>(childpid==0){</code>
<code> </code><code>printf</code><code>(</code><code>"i am child %ld\n"</code><code>, (</code><code>long</code><code>)getpid());</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>printf</code><code>(</code><code>"i am parent %ld\n"</code><code>,(</code><code>long</code><code>)getpid() );</code>
<code>i am parent 5467</code>
<code>i am child 5468</code>
上面的例子輸出了執行fork之後,父程序和子程序分别輸出自身的ID
<code> </code><code>pid_t mypid;</code>
<code> </code><code>mypid=getpid();</code>
<code> </code><code>if</code><code>(childpid==-1){</code>
<code> </code><code>perror</code><code>(</code><code>"failed to frok\n"</code><code>);</code>
<code> </code><code>// child codes</code>
<code> </code><code>printf</code><code>(</code><code>"i am child %ld, id= %ld\n"</code><code>,(</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)mypid);</code>
<code> </code><code>// parent codes</code>
<code> </code><code>printf</code><code>(</code><code>"i am parent %ld, id=%ld\n"</code><code>,(</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)mypid );</code>
<code>i am parent 5517, id=5517</code>
<code>i am child 5518, id= 5517</code>
父程序在調用fork之前,将mypid設定為自己的程序ID,執行fork之後,子程序獲得了包含所有變量在内的父程序的位址空間的一份拷貝,由于子程序沒有重置mypid,是以列印出的指不一樣。
<code> </code><code>pid_t childpid=0;</code>
<code> </code><code>int</code> <code>i,n;</code>
<code> </code><code>/*check for vaild number of common-line arguments*/</code>
<code> </code><code>if</code><code>(argc!=2){</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"usage: %s process \n"</code><code>, argv[0] );</code>
<code> </code><code>n=</code><code>atoi</code><code>(argv[1]);</code>
<code> </code><code>for</code> <code>( i = 0; i < n; ++i)</code>
<code> </code><code>{</code>
<code> </code><code>if</code><code>(childpid=fork()){</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"i:%d process id: %ld parent id: %ld child id: %ld\n"</code><code>, i,</code>
<code> </code><code>(</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)getppid(),(</code><code>long</code><code>)childpid);</code>
<code>i:0 process id: 5603 parent id: 1 child id: 0</code>
<code>i:1 process id: 5604 parent id: 1 child id: 0</code>
<code>i:2 process id: 5605 parent id: 1 child id: 0</code>
<code>i:3 process id: 5606 parent id: 1 child id: 0</code>
上面的程式簡單的建立了一個程序鍊。1->2->3->4...,另外大家要注意我在這裡使用的是stderr,而不是stdout,因為系統會對寫入stdout的進行緩沖。這樣,特定的消息不能在printf之後立即顯示。寫入stderr則不會進行緩沖,而是立即寫出。
<code> </code><code>if</code> <code>(argc!=2)</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"usage: %s processes\n"</code><code>,argv[0] );</code>
<code> </code><code>if</code><code>((childpid=fork())<=0){</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"i:%d process id:%ld, parent id: %ld, child id: %ld\n"</code><code>,</code>
<code> </code><code>i,(</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)getppid(),(</code><code>long</code><code>)childpid );</code>
上面的例子簡單的建立了一個程序扇。
<code>// this program will print some information after all the child process exits;</code>
<code>pid_t r_wait(</code><code>int</code><code>* stat_lco);</code>
<code> </code><code>while</code><code>(r_wait(null)>0); </code><code>/*wait for all of your children*/</code>
<code>pid_t r_wait(</code><code>int</code><code>* stat_lco){</code>
<code> </code><code>int</code> <code>retval;</code>
<code> </code><code>while</code><code>(((retval=wait(stat_lco)==-1)&& (</code><code>errno</code><code>==eintr));</code>
<code> </code><code>return</code> <code>retval;</code>
上面的程序扇使得所有子程序都推出之後,列印消息。
<code>#include <sys/types.h></code>
<code>#include <sys/wait.h></code>
<code>// can you discribe all of this program run's results</code>
<code>{ </code>
<code> </code><code>// set up signal handlers here</code>
<code> </code><code>perror</code><code>(</code><code>"faild to fork\n"</code><code>);</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"i am child %ld\n"</code><code>,(</code><code>long</code><code>)getpid() );</code>
<code> </code><code>}</code><code>else</code> <code>if</code><code>(wait(null)!=childpid){</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"a signal must have interrupted the wait\n"</code><code>);</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"i am parent %ld with child %ld\n"</code><code>, (</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)childpid);</code>
<code> </code>
你能描述一下上面例子的所有可能輸出嗎?
<code>#include <errno.h></code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"usage: %s processes\n"</code><code>, argv[0] );</code>
<code> </code><code>for</code> <code>(i = 0; i < n; ++i)</code>
<code> </code><code>{ </code>
<code> </code><code>for</code><code>(;;){</code>
<code> </code><code>childpid=wait(null);</code>
<code> </code><code>if</code><code>((childpid== -1)&&(</code><code>errno</code> <code>!= eintr)){</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>fprintf</code><code>(stderr,</code><code>"i am process %ld, my parent is %ld\n"</code><code>,(</code><code>long</code><code>)getpid(),(</code><code>long</code><code>)getppid() );</code>
上面的例子建立了一個程序扇,所有被建立的程序都是原始程序的子程序。
<code> </code><code>} </code><code>/*child code*/</code>
<code> </code><code>execl(</code><code>"/bin/ls"</code><code>,</code><code>"ls"</code><code>,</code><code>"-l"</code><code>,null);</code>
<code> </code><code>perror</code><code>(</code><code>"child failed to execl ls\n"</code><code>);</code>
<code> </code><code>} </code><code>/*parent code*/</code>
<code> </code><code>if</code><code>(childpid!=wait(null)){</code>
<code> </code><code>perror</code><code>(</code><code>"parent failed to wait due to signal or error\n"</code><code>);</code>
建立子程序來執行: ls -l指令。