【问题标题】:Continuously read from a pipe in C从C中的管道连续读取
【发布时间】:2023-03-30 01:30:01
【问题描述】:

我需要开发一个程序,我有 10 个子进程,每个子进程处理数组的一部分,只要在该部分中发现大于 20 的数字,该进程就会通过管道将其写入路径进程。

到目前为止,我已经想出这个来写在管道中:

for (i = 0; i < CHILDS; i++)
    {
        pids[i] = fork();
        if (pids[i] == 0)
        {
            for (j = 5000 * i; j < (5000 * i) + 5000; j++)
            {
                if (array[j].quantity > 20)
                {
                    write(fd[1], &array[j].product_code, sizeof(array[j].product_code));
                }
            }
            exit(0);
        }
    } 

我怎样才能在父进程中从该管道中读取,并且每当他读取某些内容时将其写入数组?

我试过了,但没有用:

    while ((p_code = read(fd[0], &p_code, sizeof(p_code))) > 0)
    {
        products[i] = p_code;
        i++;
    }

谢谢你:D

【问题讨论】:

  • “不工作”是什么意思?是阻塞吗? read 是否返回错误? read 是否返回意外数据?父级(不是“父级”)是否关闭了文件描述符?
  • 确认:p_code( read( ..., p_code, ...)) 不正确。您正在将数据读入 p_code,然后用返回值覆盖它。
  • @WilliamPursell 它在 products 数组中一遍又一遍地写入相同的数据。我已经解决了,非常感谢!

标签: c pipe


【解决方案1】:

您正在错误地读取管道。替换:

 while ((p_code = read(fd[0], &p_code, sizeof(p_code))) > 0)

ssize_t rc;
while ((rc = read(fd[0], &p_code, sizeof p_code)) > 0)

你不应该用read返回的值覆盖你刚刚读取的数据。

此外,您还需要检查 rc write 的返回值是否有错误,并确保父级已关闭 fd[1](除非您需要它来处理您没有的事情'未显示,即)。

【讨论】:

  • 你说得对!非常感谢,解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多