<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    linux中fork創建進程講解(轉)

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 大家知道Linux中創建子進程的一個很好的方法是函數調用fork,但是很多初學者對fork的理解上可能有點困難。我們舉個例子來看看fork的用法吧。         大家用fork的時候記住fork是“分叉”的意思就很好理解了。         記得初學fork() 函數及遇到這個函數時,總是不能理解fork為什么會這樣寫,就會分成父子兩個進程。
        先看一下fork() 的經典模式 //--------------------------------------------------------begin
    int pid=fork();
    if(pid < 0){
    //失敗,一般是該用戶的進程數達到限制或者內存被用光了   
    ........     
    }
    else if(pid == 0){
    //子進程執行的代碼
    ......
    }
    else{
    //父進程執行的代碼
    .........
    }
    .........
    //-------------------------------------------------------end
    (這段代碼可能是有點問題的,稍后解釋),首先來看fork 的返回值,有三種情況 -1,0,>0
    -1: 當然是失敗了,也不會分裂成兩個進程. 返回0是子進程,返回〉0 是父進程,此時返回的值當然是資進程的pid了。   這里是比較難理解的一個地方,他的可以這樣簡單的解釋: 當進程遇到fork調用時,將此進程整個拷貝一份,即子進程。此時,該進程的返回值被設置為〉0,即剛才 拷貝生成的子進程pid,而在拷貝生成的進程中,將返回值設置為0 。也就是此時已經有兩個進程,只有pid的值不同(忽略一起其他的設置)。      此時,兩個進程都從fork開始往下執行,只是pid不同,所以 if ..... else if .... esle 會根據pid不同來執行相應的代碼,并不是說某一部分是父進程的代碼,某一部分是自進程的代碼. 只是一些條件判斷而已.所以當fork后,真個代碼都會被兩個進程執行,只是(fork成功時)子進程中的pid 為零,所以 else if條件成立,其它兩個不成立,所以執行else if中的代碼.父進程中pid >0的,所以else成立,執行其中的代碼.  如果for()k失敗,當然是返回-1,此時是沒有子進程的.     現在來看一下,fork返回值,失敗,返回-1,linux下系統調用的一半慣例,錯誤碼在errno中. 0 子進程,因為可以通過getpid() 和getppid()獲取自己的進程和父進程的pid; >0 ,父進程中,此為fork()的子進程pid,因為進程中沒有可以獲取自己子進程pid的系統調用。此時就要把返回的pid保存起來,以后用來控制子進程。例如程序退出時調用kill(pid,9)殺死自己的子進程。    最后我想跟大家說的是,fork之后是父進程先執行還是子進程先執行,這是取決于cpu調用算法的,就是說他們誰先執行都有可能。 本文出自 “厚德載物” 博客,請務必保留此出處http://binux.blog.51cto.com/742827/163234RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全