gpt4 book ai didi

c - 将子进程的返回值接收到父进程中?

转载 作者:行者123 更新时间:2023-11-30 16:34:37 25 4
gpt4 key购买 nike

我已经阅读了这里的一些主题以获取有关此方面的信息。我理解一些,但大多数都是用不同的方法编写的。我只是找不到有关如何通过 return 语句从子进程返回值的足够信息。我责怪自己没有仔细寻找,但我却陷入了泥坑。如有任何信息,我们将不胜感激,谢谢。

我的目标(学校作业)是让子进程从父进程读取信息。子级将对从父级接收到的每个值进行数学计算(加法),然后将最终值发送回父级以打印到屏幕上。

规则: 1. 不能在子进程(仅限父进程)内使用命令行参数 2.所有数学计算必须在子进程内部。 3. 无需进行错误检查。

这是我所拥有的一些代码:

int main(int argc, char **argv){
char buf[256];
int pipeCommunication[2];
pipe(pipeCommunication);

pid_t pid = fork();

if(pid == 0){
//inside child process
int sum = 0;
read(pipeCommunication[0], buf, sizeof(buf));
sum += atoi(buf);
return sum; //WHY DOES IT NOT RETURN THE VALUE OF SUM?
}else{
int sum = 0;
for(int i = 1; i<argc;i++){
write(pipeCommunication[0], argv[i], sizeof(argv);
wait(NULL);
}
printf("sum = %d\n", sum); //WHY CANT I SEE THE VALUE OF SUM FROM CHILD?
return 0;
}
}

命令行输入为:./apprun 1 2 3输出:6(相加 1 + 2 + 3 = 6)

编辑:我意识到也许我的写入或读取函数需要清除以允许将另一个值读入子进程。仍在尝试解决这个问题。

编辑:我已经完成了作业,如果有人想查看最终代码,我将在此处发布结果。之后,该线程就完成了。

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

#define SIZE argc-1

int main(int argc, char **argv)
{
int userInput[SIZE];
int temp;
int uiSize = sizeof(userInput)/sizeof(userInput[0]);

int pipeCom[2];
pipe(pipeCom);

printf("CS201 - Assignment 3 Regular - Jonathan Vazquez\n");

pid_t pid = fork();

if (pid == 0) {

int sum = 0;

close(pipeCom[1]);
for(int i = 0;i < uiSize; i++){
read(pipeCom[0], &temp, sizeof(temp));
sum += temp;
temp = 0;
}

return sum;
}else {

int sum = 0;
for(int i = 1; i < argc; i++){
userInput[i] = atoi(argv[i]);
}

close(pipeCom[0]);
for(int i = 1; i < uiSize+1;i++){
write(pipeCom[1], &userInput[i], sizeof(userInput));
}

int status;
wait(&status);
sum = WEXITSTATUS(status);
printf("sum = %d\n", sum);
return 0;
}
}

最佳答案

父级可以将子级主函数的返回值(您在此处返回的“总和”)作为子级的退出状态进行访问。退出状态限制为 8 位(不是完整整数),因此它通常仅用于返回有限的错误代码而不是值,但它可能足够大以满足您的目的。

要在父级中获取子级的退出代码,您需要传递一个指向等待状态变量的指针而不是 NULL。将 wait(NULL) 行替换为:

int status;
wait(&status);
sum = WEXITSTATUS(status);

或者(建议使用 8 位通常是不够的),您可以创建从子级返回父级的第二个管道,并让子级将总和写入该管道并让父级读取它。

关于c - 将子进程的返回值接收到父进程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49265243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com