C语言 将整数从父级传递到子级的错误输出



我的任务是传递在命令行上输入的整数,并通过管道将它们从父级传递到子级,在那里整数可以相加并通过收割返回给父级。我所有的整数在子项中都变成了数字 4,并且 sum 的收获值始终返回为数字 1。

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
static int  toChild[2];
static int  toParent[2];
static int  input;
static int  output;
int main(int argc, char **argv)
{
pid_t   pid;
int     status;
int     nInts = argc;
// set up pipe
pipe(toChild);
pipe(toParent);
// call fork()
pid = fork();
if (pid == 0) {
close(toChild[1]);
close(toParent[0]);
// -- running in child process --
int     sum = 0;
// Receive characters from parent process via pipe
// one at a time, and count them.
// Return sum of numbers.
for (int i=1; i < nInts; i++) {
output = read(toChild[0], &input, sizeof(input));
sum += output;
}
return sum;
close(toChild[0]);
close(toParent[1]);
}
else {
close(toChild[0]);
close(toParent[1]);
// -- running in parent process --
// Send numbers (datatype: int, 4 bytes) from command line arguments
// starting with argv[1] one at a time through pipe to child process.
for (int i=1; i < nInts; i++) {
input = atoi(argv[i]);
write(toChild[1], &input, sizeof(input));
}
waitpid(pid, &status, 0);
if(WIFEXITED(status)){
// Wait for child process to return. Reap child process.
// Receive sum of numbers via the value returned when
// the child process is reaped.
printf("sum = %dn", WIFEXITED(status));
}
close(toParent[0]);
close(toChild[1]);
return 0;
}
}
output = read(toChild[0], &input, sizeof(input));
sum += output;

您正在将返回值read分配给output。这是读取的字节数,即sizeof(input)在您的平台上是 4。所以你总是sum增加 4。

你想要:

ssize_t bytes_read = read(toChild[0], &input, sizeof(input));
//check that bytes_read == sizeof(input) here
sum += input;

也:

printf("sum = %dn", WIFEXITED(status));

WIFEXITED只是说进程是否退出。使用WEXITSTATUS获取退出状态。

最新更新