即使在调用exit()函数之后,c中的进程也不会退出

时间:2012-11-02 20:02:49

标签: c

当我意识到我的程序没有退出时,我正在系统编程中练习管道。我在孩子和父母都添加了exit(),但孩子仍然没有退出。请帮忙... 这是代码:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
//#include "apue.h"

main() {
        int n,max=20;
        pid_t pid;
        int fd[2];
        char line[max];
        int i;
        for(i=0;i<20;i++) {
            line[i]='\0';
        }

        if(pipe(fd)<0) {
            perror("pipe error");
        }
        if((pid=fork())<0) {
            perror("fork error");
        }
        else if(pid > 0) {
            close(fd[0]);
            write(fd[1], "hello world\n", 12);
            exit(1);
        } else {
            close(fd[1]);
            read(fd[0], line, max);
        }
        puts(line);
        exit(1);
}

1 个答案:

答案 0 :(得分:2)

首先,fork不会在parrent中返回0。所以,当你写

  

否则if(pid&gt; 0){

     
       close(fd[0]);
       write(fd[1], "hello world\n", 12);
        exit(1); }
  

你正处在同一个过程中。要进入子进程空间,您应该使用else if(pid **==** 0)

你应该做的第二件事是确保一切正常,你不应该在子进程代码空间中调用函数exit()。您最好在parrent过程中等待您的子进程。为此,您应该在parrent过程中使用wait()函数。

好的代码是:

main() {
    int n,max=20;
    pid_t pid;
    int fd[2];
    char line[max];
    int i;
    int status;
    for(i=0;i<20;i++) {
        line[i]='\0';
    }
        if(pipe(fd)<0) {
        perror("pipe error");
    }
    pid=fork();
    if(pid <0) {
        perror("fork error");
    }
    else if(pid == 0) { // Here is the child process
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
        **// Do not kill child process because is dangeorus to do this when you use pipes**
    } else { // Parrent process
        close(fd[1]);
        read(fd[0], line, max);
        puts(line);

        wait(&status);      // Wait the child process to end its job

    }

  return 0;

}