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