linux读取sys调用不会得到EOF
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux读取sys调用不会得到EOF,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2262字,纯文字阅读大概需要4分钟。
内容图文
![linux读取sys调用不会得到EOF](/upload/InfoBanner/zyjiaocheng/966/2a3ffd86187d4b75b1a04494daf8e8cf.jpg)
首先抱歉,如果我的英语不流利和清晰.
我正在努力理解流程之间的管道和通信.我试图实现两个c程序,一个从他从标准输入读取的内容写入某个管道,另一个等待直到管道打开并从中读取并打印到标准输出直到EOF.
以下是编写器管道的代码:
fd = open(filename, O_RDWR);
if(fd == -1) print_error();
while(fgets(buffer, BUFFER_SIZE, stdin) != NULL) {
if(write(fd, buffer, BUFFER_SIZE) == -1) print_error();
}
这是读者管道的代码:
while(1) {
if((fd = open(filename, O_RDWR)) == -1) {
if(errno == ENOENT) sleep(1);
else print_error();
}
else {
while(read(fd, buffer, BUFFER_SIZE) != 0) {
fprintf(stdout, "%s", buffer);
}
}
}
问题在于,当我同时运行这两个程序时,基本概念有效,我在编写器程序中向标准输入写了一些东西,我在另一个终端中看到读取器程序将它打印到标准输出.问题是,当我通过按CTRL D为编写器程序发送EOF时,读取器程序仍然等待输入,我确定它不是因为while(1),我在调试器中看到了读取系统调用只是等待输入并且不明白我们得到了EOF,行:read(fd,buffer,BUFFER_SIZE)即使没有输入也没有评估.
我希望我提供解决问题所需的所有数据,任何人都有任何想法出了什么问题?
解决方法:
如果fgets()检测到EOF,它将返回其读缓冲区中已有的内容或仅返回NULL.
在后一种情况下,您希望通过例如关闭管道来通知读取端传输已结束.
int fd = open(filename, O_RDWR);
if (fd == -1)
{
perror("open() failed");
}
else
{
while (fgets(buffer, BUFFER_SIZE, stdin) != NULL)
{
if (write(fd, buffer, BUFFER_SIZE) == -1)
{
perror("write() failed");
break;
}
}
if (ferror(stdin))
{
perror("fgets() failed");
}
close(fd); /* The other end's blocking call to read() would return 0. */
}
在任何情况下都不会读取类似EOF的内容. EOF不是一个角色,而是一个国家.
从man 3 read开始:
If some process has the pipe open for writing […]
read()
shall block the calling thread until some data is written or the pipe is closed by all processes that had the pipe
open for writing.
此代码也不包括read()失败:
while(read(fd, buffer, BUFFER_SIZE) != 0) {
fprintf(stdout, "%s", buffer);
}
它应该看起来像这样的例子:
ssize_t result;
while (0 != (result = read(fd, buffer, BUFFER_SIZE)))
{
if (0 > result)
{
if ((EINTR == errno) || (EAGAIN == errno))
{
continue;
}
perror("read() failed");
break;
}
fprintf(stdout, "%s", buffer);
}
更多这个循环……
while(1) {
if((fd = open(filename, O_RDWR)) == -1) {
if(errno == ENOENT) sleep(1);
else print_error();
}
...
}
…错过关闭()fd,然后(重新)打开它.
如果读者不写,则通过指定O_RDONLY而不是RDWR来打开管道.
内容总结
以上是互联网集市为您收集整理的linux读取sys调用不会得到EOF全部内容,希望文章能够帮你解决linux读取sys调用不会得到EOF所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。