写入管道总是失败

时间:2018-12-07 22:08:12

标签: c linux process pipe fork

我试图通过尝试将文本文件中的数据读入第一个管道并在另一个管道上读取它来在两个进程之间进行通信,但是写功能始终失败:

主要

int main(int argc, char* argv[])
{
    int readerPip[2], writerPip[2], reader, writer;

    if (pipe(readerPip))
    {
      fprintf (stderr, "Pipe failed.\n");
      return EXIT_FAILURE;
    }

    if(pipe(writerPip))
    {
      fprintf (stderr, "Pipe failed.\n");
      return EXIT_FAILURE;
    }

    close(readerPip[1]); // closing reader writing side pipe for main thread
    reader = fork();
    if (reader < 0)
    {
        perror("Cannot fork()");
        exit(EXIT_FAILURE);
    }
    else if (reader == 0)
    {
        do_reader(readerPip);
    }

    wait(NULL);
    close(writerPip[0]); // closing writer reader side pipe for main thread
    do_father(readerPip, writerPip);
    close(readerPip[0]); // closing reader reader side pipe for main thread
    close(writerPip[1]); // closing writer writing side pipe for main thread
    writer = fork();

    if (writer < 0)
    {
        perror("Cannot fork()");
        exit(EXIT_FAILURE);
    }
    else if (writer == 0)
    {
        do_writer(writerPip);
    }

    return 1;
}// main

do_Reader:

void do_reader(int readerPipe[])
{
    char stringCommand[17];
    long long unsigned command;

    close(readerPipe[0]);
    while (1)
    {
        scanf("%s", stringCommand);
        command = convertStringToPolygon(stringCommand);

        if ((command & 0xFFFFFFFF) == 0xFFFFFFFF)
        {
            break;
        }

        if (write(readerPipe[1], stringCommand, strlen(stringCommand) ) == -1)
        {
            printf("writing falied");
        }
        else
        {
            printf("success");
        }

        printf("\n");
    }

    close(readerPipe[1]);
    exit(0);
}

做父亲

void do_father(int readerPipe[], int writerPipe[])
{
    long long unsigned nbytes;
    char currentPolygon[17];
    currentPolygon[16] = '\0';
    while (1)
    {
        nbytes = read(readerPipe[0], currentPolygon, sizeof(currentPolygon));
        if (nbytes == 0)
        {
            printf("done");
            break;
        }

        manageProgram(readerPipe, writerPipe,        convertStringToCommand(currentPolygon));
    }
}

写作者

void do_writer(int pip[])
{
    close(pip[1]);
    long long unsigned command, nbytes;

    while (1)
    {
    nbytes = read(pip[0], &command, sizeof(command));
        if (nbytes == 0)
        {
            break;
        }
        if ((((command & THIRD_BIT_MASK) != FALSE) || ((command & FORTH_BIT_MASK) 
!= FALSE) ||
            ((command & FIFTH_BIT_MASK) != FALSE)) != FALSE)
            generateOutputDependsOnBits(command);
    }

    close(pip[0]);
    exit(0);
}

其余的代码无关紧要,因为为读取器管道进行的写入无法正常工作。 文本文件如下所示:

  

3a   0000050000050505   3e   003cc40000c43c3c   BA   000088ec9c32ce32   f8   抄送   3a   000085ec9a32cd32   4c   8c   5c   交流电   fd   FFFFFFFFFFFFFFFF

1 个答案:

答案 0 :(得分:1)

您在readpipe[1]中关闭main(在fork之前),然后在readpipe[0]中关闭do_reader,所以管道的两个侧面在孩子中都是封闭的。

close(readpipe[1])中的main向下移动(例如,在wait之前)。

但是,您可能不想在那里wait。您可能想在do_father之后执行此操作,因为这将依赖于内核管道缓冲区足够大,以容纳子对象发送给父对象的 all 数据,甚至在父对象尝试获取子对象之前,第一个字节。