我正在从父到子的主要命令行参数,并计算它们和打印。我的问题是,我不确定我是否正在收割孩子?我不需要退出0 还是我需要再次拨打电话?
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int length = 0;
int i, n;
int fdest[2]; // for pipe
pid_t pid; //process IDs
char buffer[BUFSIZ];
if ((pid = fork()) < 0) /* attempt to create child / parent process */
{
printf("fork error");
}
if (pipe(fdest) < 0) /* attempt to create pipe */
printf("pipe error");
/* parent process */
else if (pid > 0) {
close(fdest[0]);
for(i = 1; i < argc; i++) /* write to pipe */
{
write(fdest[1], argv[i], strlen(argv[1]));
}
} else {
/* child Process */
close(fdest[1]);
for(i = 1; i < argc; i++)
{
length +=( strlen(argv[i])); /* get length of arguments */
}
n = read(fdest[0], buffer, length);
printf("\nchild: counted %d characters\n", n);
}
exit(0);
}
答案 0 :(得分:11)
不,你没有正确收割孩子。在您的情况下,如果子进程在父进程退出之前完成,则该子进程将变为僵尸。然后,当父进程完成时,子进程将被重新分配给init
(无论它已经完成并且是僵尸,还是仍然在运行)。 init
然后为你收割孩子。
要收获孩子,请在wait()
之前添加对exit
的电话。
顺便说一下,你还有另一个错误 - 你正在 fork
之后创建管道,所以父和子都创建了一个(不同的)管道 - 它们没有连接。在if (pipe(...
之前向上移动fork()
。