0

每当我使用等待功能时,我的代码都会在 open() 上暂停,没有它,程序将无法工作。没有错误代码,但我想知道出了什么问题。

代码最终将是 controller.c 将打开 c1,c2,c3。它将等待 c1 获得输入并将其放入管道,然后将其转到 c2 将其打印,然后 c3 将以不同的格式打印它。

int main(int ac, char**av)
{
    int fd;
    int test;
    char * myfifo = "/tmp/myfifo";
    unlink(myfifo);                     //makes sure no fifo already exists

    /* create the FIFO (named pipe) */
    if((mkfifo(myfifo, 0666)) <0)
        perror("MKFIFO: ");



    int statval;
    pid_t pid1 = fork();                    //creates a process for c1 to run in
    wait(&statval); 
    if ( pid1 == 0)                     //makes sure to only run the program in the child process
    {   
        printf("Opening c1\n");
        int x = execvp("./c1",av);          //Runs the other file based on the array
        if (x == -1)
            exit (1);
        perror("Error");                //used for error reporting
        printf("Closing c1\n");
        exit(0);                    //ends process when finished
    }
    if (WIFEXITED(statval))                 //if there is an exit code
    printf("\nChilds exit code %d\n", WEXITSTATUS(statval));//prints the exit status of the child process

    pid_t pid2 = fork();                    //creates a process for c2 to run in
    wait(&statval); 
    if ( pid2 == 0)                     //makes sure to only run the program in the child process
    {   
        printf("Opening c2\n");
        int x = execvp("./c2",av);          //Runs the other file based on the array
        if (x == -1)
            exit (1);
        perror("Error");                //used for error reporting
        exit(0);                    //ends process when finished
    }
    if (WIFEXITED(statval))                 //if there is an exit code
    printf("\nChilds exit code %d\n", WEXITSTATUS(statval));//prints the exit status of the child process

    unlink(myfifo);

C1:

printf("TEST1\n");
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    int fd;
        char * myfifo = "/tmp/myfifo";
        char buf[BUFSIZE];

    fd = open(myfifo, O_WRONLY);
    if (fd < 0)
        perror("OPEN: ");   

    //while (1) {
        printf("Enter a line of text\n"); 
        //scanf("%s", buf);
        if ((strcmp(line,"-999"))==0){
            printf("TEST");         
            //break;
        }
        //write(fd, buf, sizeof(buf));
            write(fd, "hi", sizeof("hi"));
    //}
    close(fd);
    unlink(myfifo);
        return 0;

C2:

int fd;
    char * myfifo = "/tmp/myfifo";
    char buf[BUFSIZE];

    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, BUFSIZE);
    printf("Received: %s\n", buf);
    close(fd);

    return 0;

该程序将打开 c1,打印 TEST,然后在我手动退出之前什么都不做。

4

1 回答 1

2

在第一次分叉之后, parent 和 child wait()。孩子的呼叫失败,因为它没有未等待的孩子,但您忽略了结果。然后子进程执行程序c1,它(假设执行成功)反过来打开 FIFO 进行写入。这会阻塞直到 FIFO 的另一端被打开,但另一端不会被您的程序打开,因为父进程在继续之前等待子进程退出。您已经创建了一个死锁。

在另一个(或其他程序)打开 FIFO 的另一端之前,任何一个孩子都不能继续打开 FIFO,因此父母必须在等待任何一个孩子之前分叉两个孩子。此外,wait()尽管孩子们对该函数的调用应该很快失败,但孩子们这样做是没有意义的。

于 2016-05-27T03:58:06.650 回答