linux進程編程

       前一陣子,寫了一個在linux上的遠程下載程序。寫好後測試了幾遍都沒問題,但是由另外一個程序調用本程序時,system函數都失效了,查看errno的值爲10,沒有子進程。本以爲只要保證程序單獨運行時不出錯,在其他進程中調用也就不會有問題,顯然並非如此。

      簡單描述下我的程序:在程序中,多個地方調用了system函數,因爲調用system函數較爲方便。system創建一個進程執行調用的命令,調用的命令執行完後才繼續執行下面的語句。當本程序被其他程序調用時,用到system的地方都失敗了,於是用函數代替system調用,找不到替代函數的就用fork()+execl()替代。這樣做程序單獨調用都沒有成功。原因是父子進程要同步。於是在父進程中fork完子進程後,用wait()把自己掛起來,子進程結束後,父進程繼續運行。總的來說是我用for()+execl()+wait()代替了system()。

     調用wait()函數,子進程返回值是-1,錯誤碼是10—沒有子進程。這是爲什麼呢?這是因爲父進程在fork()前調用了signal(SIGCHLD, SIG_IGN)處理殭屍子進程,所以父進程再調用wait()函數時,殭屍子進程已經不存在了。所以調用wait()函數就馬上返回-1的錯誤值。

    
    下面簡單簡述對進程編程的理解。

     父進程創建子進程,父進程如果不想等待子進程,父進程可以在fork()前使用signal(SIGCHLD, SIG_IGN)回收子進程。子進程先於父進程退出,子進程就變成了殭屍進程。 殭屍進程會佔用系統資源,所以父進程要回收子進程。回收方法除了用signal信號函數外,還可以用wait或waitpid函數。如果父進程先於子進程退出,子進程由Init進程接管。Init進程處理殭屍子進程。

     如何編寫一個守護進程,可以參考一下:

     http://blog.csdn.net/hairetz/article/details/4195036






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章