子进程 c 的返回值
Posted
技术标签:
【中文标题】子进程 c 的返回值【英文标题】:return value from child process c 【发布时间】:2017-04-22 03:41:21 【问题描述】:我需要帮助将我的子程序中的“状态代码”返回给父程序,在那里它将检查状态代码、打印代码并退出父程序。这是一个类项目,所以我会在这里放一些相关的代码,但出于明显的原因我不会发布整个项目。
我已经通过 exec 分叉并创建了子进程。父进程做了一些花哨的数学运算,并使用命名管道将数据推送到子进程。孩子做一些更花哨的数学。当我使用关键字时,孩子需要将它完成花哨数学的次数返回给父母,父母会看到这个,打印出返回的数字,然后退出父母。
int status;
pid_t child_id;
child_id = fork();
if (child_id == 0)
// put child code here
exec(opens second process);
if (child_id < 0)
perror("fork failed\n");
exit(EXIT_FAILURE);
while(child_id != 0)
//parent process
//do fancy math stuff here
// pipe
//open pipe
//converted math to "string" to pass to other program
// use fprintf to send data to other program
fprintf(fp,"%s",str);
//close pipe
//**************************************************
//this block doesn't work, always returns 0
if (WIFEXITED(status))
int returned = WEXITSTATUS(status);
printf("exited normally with status %d\n",returned);
//***************************************************
return 0;
第二个 c 程序只是简单地读取管道,做一些更花哨的数学运算,并在我想要返回数字的地方放置了 return 语句。
据我了解,有一种方法可以从子程序传递返回值,但我似乎无法理解如何。我已经添加了一段我找到的代码,但我似乎无法让它工作。我读过它,但也许我遗漏了什么?
请忽略任何语法或结构问题。
【问题讨论】:
在调用exec()
之后插入以下两行:perror( "exec failed" )l exit( EXIT_FAILURE );
表示调用exec()
失败时的“罕见”情况
【参考方案1】:
您试图通过WIFEXITED
函数读取status
,但您从未给它一个值。尝试读取未初始化的值会调用 undefined behavior。
您需要调用wait
函数,该函数告诉父级等待子级完成并接收其返回码:
wait(&status);
if (WIFEXITED(status))
int returned = WEXITSTATUS(status);
printf("exited normally with status %d\n",returned);
【讨论】:
@user7904063 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer。以上是关于子进程 c 的返回值的主要内容,如果未能解决你的问题,请参考以下文章