gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:24:49 25 4
gpt4 key购买 nike

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

最佳答案

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

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

您应该循环读取,调整缓冲区的偏移量,直到读取整个 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;
}
}

关于c - 使用 open() 系统调用读取写入 FIFO 的所有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com