这是我第一次从文件描述符中读取数据,我已经试了3个小时了,几乎让我的阅读器工作了我只是需要一点帮助来检查命名管道上的EOF。
好的,我要打开一个(多个井)命名管道,如下所示:
fds[j].fd = open(pipeNameo, O_RDWR) ; // storing it into my file descriptor array
然后,我将轮询命名管道以查看是否有任何内容通过(轮询在循环内):
int ret = poll(fds, numOfPipesUsed, timeout_msecs);
当有东西经过时,我通过将写入的文件描述符发送到此函数来处理文件:
int processFileDes( int fd )
{
char buf[10] ;
read(fd, buf, 1) ;
char curr = buf[0] ;
while (curr != EOF)
{
if ( curr == ' ')
{
// do nothing it is a space
}
else if ( curr == '\n')
{
printf("NEW LINE!\n") ;
}
else
{
int num = curr - '0' ; // turns char number into an int
printf("Curr Num: %d\n", num) ;
}
printf("BEFORE\n"); // Gets stuck here when EOF, this is the string of output
read(fd, buf, 1) ;
printf("AFTER\n") ;
curr = buf[0] ;
}
printf("Success!\n") ; // this is never printed
return 0 ;
}
一切都很好,除了
read()
函数在所有字符都被读取后卡住(等待返回)EOF应该在哪里我需要能检查一下EOF。我尝试了一种解决方法,通过计算读取的字符数(因为我知道输入的大小)来停止程序的读取,而且它本来是可以工作的,唯一的问题是当最后一个字符后面有空格时,它会导致循环轮询返回1,并在剩余的要读取的空格(无效输入)上再次运行
processFile()
。请帮忙:')
输入只是一个数字矩阵,如下所示:
0 1 1
2 0 3
1 0 0
最佳答案
您需要打开非阻塞,因为管道将等待数据可用:
fds[j].fd = open(pipeNameo, O_RDWR | O_NONBLOCK);
关于c - 使用read()函数时检查EOF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24941819/