天天看點

Linux c學習--程序基礎學習

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;stdlib.h&gt;</code>

<code>#include &lt;unistd.h&gt;</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>&lt;br&gt;&lt;br&gt;簡單的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 &lt; 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-&gt;2-&gt;3-&gt;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())&lt;=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)&gt;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)&amp;&amp; (</code><code>errno</code><code>==eintr));</code>

<code>        </code><code>return</code> <code>retval;</code>

 上面的程序扇使得所有子程序都推出之後,列印消息。

<code>#include &lt;sys/types.h&gt;</code>

<code>#include &lt;sys/wait.h&gt;</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 &lt;errno.h&gt;</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 &lt; 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)&amp;&amp;(</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指令。

繼續閱讀