open () блокирует при открытии fifo - PullRequest
0 голосов
/ 17 января 2020
#define FIFO1       "/tmp/fifo.1"
#define FIFO2       "/tmp/fifo.2"

//#define   FILE_MODE   O_CREAT | O_EXCL
//#define   FILE_MODE   S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
#define FILE_MODE   0666

int32_t main()
{
    if ((mkfifo(FIFO1, FILE_MODE)  < 0) && (errno != EEXIST))
    {
        cout << "Can&apos;t create fifo " << FIFO1 << endl;
        return 1;
    }

    if ((mkfifo(FIFO2, FILE_MODE)  < 0) && (errno != EEXIST))
    {
        cout << "Can&apos;t create fifo " << FIFO2 << endl;
        unlink(FIFO1);
        return 2;
    }

    cout << "FIFO created. Now creating child process..." << endl;

    pid_t child_pid = fork();
    if (child_pid == 0)
    {
        cout << "Inside child process..." << endl;

        int32_t read_fd = open(FIFO1, O_RDONLY, 0);
        cout << "[CHILD] Read fd = " << read_fd << endl;
        int32_t write_fd = open(FIFO2, O_WRONLY, 0); 
        cout << "[CHILD] Write fd = " << write_fd << endl;

        child_process(read_fd, write_fd);

        exit(0);
    }

    cout << "Inside parent process..." << endl;

    int32_t read_fd = open(FIFO2, O_RDONLY, 0); 
    cout << "[PARENT] Read fd = " << read_fd << endl;
    int32_t write_fd = open(FIFO1, O_WRONLY, 0);
    cout << "[PARENT] Write fd = " << write_fd << endl;

    parent_process(read_fd, write_fd);

    waitpid(child_pid, 0, 0);

    close(read_fd);
    close(write_fd);

    unlink(FIFO1);
    unlink(FIFO2);

    return 0;
}

В приведенном выше коде первый open () блокируется бесконечно как для родительского, так и для дочернего процесса. Я пытался со всеми комбинациями FILE_MODE, прокомментированными в коде, но он блокирует Ваша помощь приветствуется.

...