2

当我意识到我的程序没有退出时,我正在练习系统编程中的管道。我添加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);
}
4

1 回答 1

2

首先,fork 在子节点中返回 0 而不是在父节点中。所以,当你写

否则如果(pid > 0){

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

您处于父进程中。要在子进程空间中,您应该使用else if(pid **==** 0)

您应该做的第二件事是确保一切正常,您不应该在子进程代码空间中调用 function exit()。您最好在父进程中等待您的子进程。为此,您应该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;

}

于 2012-11-02T20:42:23.827 回答