如何从C中的完整命名管道读取数据,以检查在再次写入之前需要读取多少字节?

问题描述 投票:0回答:1

我的任务是:
a) 检查命名管道的容量 (FIFO)
b) 在再次写入之前检查需要从完整管道读取多少字节。

我的代码成功写入管道,直到它已满并表示其容量为 65536 字节,但随后读取失败(if 条件检查的值为 -1),并且由于我未知的原因,它设法写入没有读任何东西就满管了。读取失败的错误代码是“资源暂时不可用”。下面是我的代码,为了清楚起见,删除了调试打印。代码的输出是“读取0字节后写入成功”。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
    int l = 0;
    int stream;
    char* fifo = "/tmp/fifo";
    mkfifo(fifo, 0666);
    char test = 255;
    int p = fork();
    char readtest;

    if (p > 0) { //rodzic
        wait(NULL);
        stream = open(fifo, O_RDWR | O_NONBLOCK);
        while (1) {
            if (read(stream, &readtest, 1) == 1) {
                l++;
                printf("Read byte %d, attempting write", l);
            }
            if (write(stream, &test, 1) == 1) {
                printf("Write successful after reading %d bytes\n", l);
                return 0;
            }
        }
    } else if (p == 0) { //dziecko
        stream = open(fifo, O_RDWR | O_NONBLOCK);
        while (write(stream, &test, 1) == 1 ) {
            l++;
            //printf("b%d\n", l);
        }
        close(stream);
        printf("Wrote %d bytes, pipe full\n", l);
        _Exit(0);
    }
c pipe fifo
1个回答
0
投票

在这种情况下,父级和子级从不同的管道读取。 通常(非非阻塞),当您打开一个 fifo 进行写入时,打开的操作将不会返回,直到其他进程打开相同的 fifo 进行读取。 此时,这两个进程共享一个管道。 由于您的孩子正在非阻塞地打开 fifo,因此它不会等待读者。 当孩子关闭管道时,它写入的所有数据都会消失在以太中。 父进程随后打开 fifo 并获得一个从未被写入的不同管道。

© www.soinside.com 2019 - 2024. All rights reserved.