1. 程式人生 > >Linux wait/waitpid詳解

Linux wait/waitpid詳解

轉載:
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不阻塞