这是我第一次从文件描述符中读取数据,我已经试了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/

10-15 06:06