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)

すべてが正常に機能することを確認するために行うべき 2 番目のことは、子プロセスのコード空間で 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 に答える