c - 写入管道总是失败

标签 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);
}

do_father

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));
    }
}

do_writer

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 cc 3a 000085ec9a32cd32 4c 8c 5c ac fd FFFFFFFFFFFFFFFF

最佳答案

您在main中关闭readpipe[1](在fork之前)并关闭readpipe [0]do_reader 中,因此管道的两侧在子级中都是关闭的。

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

但是,您可能不想在那里等待。您可能希望在 do_father 之后执行此操作,因为这将依赖于内核管道缓冲区是否足够大,以在父级尝试之前容纳子级发送到父级的所有数据。获取第一个字节。

关于c - 写入管道总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677401/

相关文章:

c - 如何通过引用传递结构并更改其值

linux - 从几个文件夹中删除一些文件

java - 任何支持 Process.supportsNormalTermination==true 的虚拟机?

c# - 进程线程(或整个进程)是否被挂起

c++ - 在 C++ 中 reshape Matlab

c - 将 Malloc char 指针传递给函数

c - 反转链表的每 k 个节点

linux - 在linux中执行一个目录

linux - 同一远程主机和端口上的多个 SSH 反向端口隧道

c# - 使用 Process.Start 启动 WPF 应用程序