gpt4 book ai didi

c - 收割僵尸进程-child

转载 作者:行者123 更新时间:2023-12-02 05:55:02 26 4
gpt4 key购买 nike

我正在将命令行参数从父级传递给 main 并计算它们并打印。我的问题是我不确定我正在收割 child ?难道我只需要一个导出 0还是我需要再次调用 fork?

#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);
}

最佳答案

不,你没有正确收割 child 。在您的情况下,如果子进程在父进程退出之前完成,则子进程将成为僵尸。然后,当父进程结束时,子进程将重新成为 init 的父进程(无论它已经结束并且是僵尸进程,还是仍在运行)。 init 然后为您收割 child 。

要获取 child ,请在 exit 之前添加对 wait() 的调用。

顺便说一下,您还有另一个错误 - 您在 fork 之后 创建了管道,因此父项和子项各自创建了一个(不同的)管道 - 他们'没有连接。将 if (pipe(... 向上移动到 fork() 之前。

关于c - 收割僵尸进程-child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353079/

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