Xyz*_*yzk 0 c fork solaris exit wait
我糊涂了.据说,基于man和许多其他来源,如下所示: 当操作系统终止你的进程 等待(和状态)时返回代码应该可以让我获得退出状态或返回子进程的值?
那两段代码,应该让我看到它的孩子的退出值,然后打印出来.子进程函数:
int childFunction(char in[],char logPath[]){
FILE *logFile= fopen( logPath, "a" );
if(logFile==NULL)
return 1;
int c=system(in);
fclose(logFile);
return(c);
}
Run Code Online (Sandbox Code Playgroud)
主要:
{...some unimportant code before this}
result= fork();
if(result==0){
exit(childFunction(inLine,logPath));
}
else if(result>0){
int status=0;;
int c=(int)waitpid(-1,&status,0);
printf("a:%d b:%d\n",status, WIFEXITED(status));
else
return -1;
i=0;
Run Code Online (Sandbox Code Playgroud)
我试着等待,睡了一段时间,退出,返回,并阅读手册页几次.在我对这个功能的理解中存在一个基本错误,或者在看了4个小时后我再也看不到它了.
解决由于某种原因,我绝对不明白,如果你改变return(c)in childFunction if(c!=)return(1);else return(0)它将工作.不知道为什么.
已解决2好的,现在我想我知道为什么.看,似乎返回调用或等待将状态减少到8个最高有效位(256).那是什么意思?这意味着,如果发送普通int,则使用前几位,而丢弃最后8位.同时,当我指定return (1)编译器自动"缩短"int为short int时.解决方案是返回一个简短的数字,或者像我在之前的"已解决"评论中那样做.
问题是你不是在等孩子退出
Run Code Online (Sandbox Code Playgroud)int c=(int)waitpid(-1,&status,WNOHANG);
这里父进程检查子进程是否已退出,如果子进程未退出则返回.
在上面的情况中,由于您在子进程中打开文件,因此在子进程中存在IO等待的可能性更大,因此将执行父进程.
现在父进程将检查状态,因为WNOHANG它被使用它将不会在waitpid被阻止并且它继续,这就是你没有得到正确状态的原因
我建议你用
Run Code Online (Sandbox Code Playgroud)int c=(int)waitpid(&status);
| 归档时间: |
|
| 查看次数: |
6678 次 |
| 最近记录: |