使用open()系统调用读取FIFO中写入的所有字符

时间:2014-11-28 16:25:11

标签: c fifo

我有一个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);
    }

1 个答案:

答案 0 :(得分:0)

第一个小评论:您应该使用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;
    }
}