IT序号网

c之收割僵尸进程-child

softidea 2024年09月03日 编程语言 18 0

我正在将命令行参数从父级传递给 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() 之前。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!