Linux wait/waitpid詳解
阿新 • • 發佈:2018-12-13
轉載:
1、https://blog.csdn.net/zhangxiao93/article/details/72859312
2、https://blog.csdn.net/u011068702/article/details/54409273
PS:兩者結合看,更能深刻理解Linux中waitpid函式的原理,及用法。
例項:
/* <case> <li> 用例名稱: ExIccLock_UnlockCard_FUN1 <li> 測試目的: 通過主裝置控制從裝置的鎖卡功能正常 <li> 測試步驟: 1.建立一個程序,子程序中進行下面2~4步驟的操作; 2.呼叫ExProfileConfig介面載入對應的json檔案配置profile環境,檢視函式返回值是否正確; 3.呼叫ExIccLockCard函式,檢視從裝置上的使用者IC卡是否成功鎖卡,函式返回值是否正確; 4.呼叫ExIccUnlockCard函式,檢視從裝置上的使用者IC卡是否成功解鎖,函式返回值是否正確; 5.主程序中等待子程序退出; <li> 通過標準: 2.函式返回RET_OK; 3.從裝置上的使用者IC成功鎖卡,函式返回RET_OK; 4.從裝置上的使用者IC成功解鎖,函式返回RET_OK; <li> 優先順序: 中 <li> 執行方式: 手動 <li> Test Data: IM500_usb.json <li> </case> */ static void ExIccLock_UnlockCard_FUN1(void) { int pid, ret; int key; char value[2]={0}; printline_p(2, 0, "key1-uart"); printline_p(3, 0, "key2-usb"); key=getkey(); sprintf(value, "%d", key); ret=ExRegSetValue("rt.sys.key",value); ASSERT(ret==RET_OK, "ExRegSetValue=%d value=%s", ret, value); pid=fork(); if(pid<0) FAIL("fork error, pid=%d", pid); else if(pid==0) { EXEC("ExIccLock_UnlockCard_FUN1_1"); exit(0); } else { int iRet; iRet=ExIccLockCard(); ASSERT(iRet==ERR_SYS_NOT_SUPPORT, "ExIccLockCard=%d",iRet); iRet=ExIccUnlockCard(); ASSERT(iRet==ERR_SYS_NOT_SUPPORT, "ExIccUnlockCard=%d",iRet); waitpid(pid, NULL, 0); } }
解析:其中函式waitpid(pid, NULL, 0); 表明父程序等待子程序退出(且阻塞型退出)
入參: pid > 0 :只等待程序ID等於pid的子程序,不管是否已經有其他子程序執行結束退出,只要指定的子程序還沒有結束,waitpid就會一直等下去。
入參:statloc=NULL,此處表明不關心終止的子程序的狀態。
statloc:指向終止程序的終止狀態,如果不關心終止狀態可指定為空指標。
入參:options = 0 ,此處表明會阻塞父程序,一直等待子程序,直到退出。
options:控制waitpid的操作:
1,2是支援作業控制
1.WCONTINUED(0)同wait,阻塞父程序,等待子程序退出
2.WUNTRACED
3.WNOHANG waitpid不阻塞