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不阻塞

猜你喜欢

转载自blog.csdn.net/ZoeyZY/article/details/83930073
今日推荐