Fork and Pipe程序无法正常工作

时间:2017-04-29 18:57:31

标签: c unix pipe fork child-process

我试图编写一个简单的fork()和pipe()程序,该程序从用户获取输入并通过子进程中的管道输出。但不知怎的,我没有得到我希望得到的结果。

第一个输入工作正常,例如我输入"嗨"得到结果" Prozessmanager:嗨",但是一旦我尝试输入下一个字符串,它就会崩溃或以某种方式停止工作,直到我输入一个" Q"退出我的程序。

我试图调试它并得到结果,我试图写入破损的管道。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    //#include <signal.h>

    #define BUFSIZE 512
    //int clock = 0;

    //void handler(int signum) {
    //clock++;
    //printf("Clock: 00:00:%d\n", clock);
    //}

    int main(int argc, char** argv) {
        pid_t prozessmanager;
        pid_t reporter;
        int pipefd[2];
        int status;
        char str[BUFSIZE];
        char buf[BUFSIZE];


        if ((pipe(pipefd)) == -1) {
            perror("pipe() error");
            exit(1);
        }

        if ((prozessmanager = fork()) == -1) {
            perror("fork() error");
            exit(1);
        } else if (prozessmanager == 0) { //Prozessmanager prozess
            while (1) {
                //signal(SIGALRM, handler);
                //while(1){
                //alarm(1);
                //}
                close(pipefd[1]);
                read(pipefd[0], buf, sizeof (buf));
                /*if (*buf == 'S') {
                    //handler(clock);
                } else {*/
                if (*buf == 'P') {
                    if ((reporter = fork()) == -1) {
                        perror("fork() error");
                        exit(1);
                    } else if (reporter == 0) { //Reporter prozess
                        printf("Im a Report Prozess, PID: %d\n", getpid());
                        exit(0);
                    } else { //Prozessmanager waits for Reporter
                        wait(&status);
                        printf("Report terminated, PID: %d\n", reporter);
                        break;
                    }
                } else if (*buf == 'Q') {
                    printf("Exit Prozessmanager, PID: %d\n", getpid());
                    exit(0);
                } else {
                    printf("Prozessmanager: %s", buf);
                    break;
                }
                //}
            }
        } else { //Kommandant prozess
            while (1) {
                close(pipefd[0]);
                fgets(str, 80, stdin);
                write(pipefd[1], str, sizeof (str));
                if (*str == 'Q') {
                    break;
                }
            }
            wait(&status);
            printf("Exit Kommandant, PID: %d\n", getpid());
            exit(0);
        }
        return (0);
    }

0 个答案:

没有答案