【问题标题】:Read all characters written in FIFO using open() system call使用 open() 系统调用读取写入 FIFO 的所有字符
【发布时间】:2014-11-28 16:25:11
【问题描述】:

我有一个 FIFO 管道,它在 O_RDWR 模式下使用 open() 在两端打开。在读取端,read() 不是读取所有字符,而是小于调用中指定的字符。有没有办法确保使用 open() 读取所有字符?

提前致谢

if (p != NULL){

        printf("Inside p not null!\n");

        if((fd = open(p, O_RDWR)) < 0){
            perror("File could not be opened!");
            exit(EXIT_FAILURE);
        }

        //FILE *rdptr = fopen(p,"r");

        memset(buf,0,file_len);
        rc = read(fd, buf, file_len);
        printf("Number of bytes read: %d\n", rc);

        printf("Data detected on FIFO\n");
                buf[rc] = '\0';
                char base[20] = "output.txt";
                char name[20];
                sprintf(name, "%d%s", suffix, base);
        FILE *fptr = fopen(name,"ab+");
        fd_wr = open(name,O_WRONLY);
        charnum = write(fd_wr,buf,rc);
        kill(id_A, SIGKILL);
        //printf("No. of characters written: %d\n",charnum);
                //FD_CLR(fd, &rdfs);
    }

【问题讨论】:

  • 您是否尝试再次调用read() 以读取剩余字符?
  • 不,我只读过一次。代码已添加到已编辑的帖子中。我不知道该怎么做。
  • 如果您正在写入固定数量的数据然后杀死作者,为什么不直接使用文件呢?看来这里不需要 FIFO。
  • 不,实际上每个写入器都必须写入一个单独的FIFO,由上面的进程读取,然后它会杀死写入器。 FIFO 是要求的一部分。我无法改变这一点。

标签: c fifo


【解决方案1】:

第一个小评论:您应该使用O_RDONLY 打开文件:不要使用不必要的权限。

第二个问题:如果file_len 非常大,可能是写入器阻止了尝试写入整个数据块(因为 FIFO 只能保存一定数量的未读数据)。如果是这种情况,那么read 将只读取已存储在 FIFO 中的数据,并立即返回它可以读取的任何内容。这将允许写入器写入更多字节,然后将在下一个read 中读取。

您应该循环读取,调整缓冲区的偏移量,直到读取整个 file_len 字节。像这样的:

size_t offset = 0;
while(offset < file_len) {
    rc = read(fd, buf+offset, file_len-offset);
    if(rc < 0) {
        /* handle I/O error or something... */
    } else {
        offset += rc;
    }
}

【讨论】:

  • 对不起,我无法正确格式化它,但这是您的意思吗?
  • 没有。 read 会产生一些部分输出,您必须增加偏移量才能阅读更多内容。 (这就像读一本书:你从你离开的地方开始,而不是从头开始)。
  • 使用该代码,我试图在退出 while 循环后打印 rc,但它从不这样做。似乎循环没有退出,可能是因为读取被阻止或其他原因。
  • 有没有办法“刷新”一个 FIFO?我不知道用这个词是否合适。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2010-10-10
  • 2017-04-16
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多