使用民意调查从管道读取

时间:2010-10-22 16:22:28

标签: c unix pipe

我试图使用poll从管道读取数据,这里是代码:

#include <stdio.h>
#include <fcntl.h>
#include <poll.h>
#define MAX_BUFF_SIZE 128

int main(void){
    char buff[MAX_BUFF_SIZE];
    char *buf;
    int fd,ret,len;
    struct pollfd fdinfo[1];

    if((fd = open("/home/s/pipe", O_RDONLY)) == NULL) {
        printf("Error Opening File.\n");
        exit(1);
    }

    fdinfo[0].fd = fd;
    fdinfo[0].events = POLLIN|POLLPRI ;

    while(1){
        ret = poll(fdinfo,1,-1);
        if (ret < 0) printf("\n\r error");

        if ( ((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI) ){
            len = read(fdinfo[0].fd, buff, MAX_BUFF_SIZE);
            if (len > 0){
                buff[len] = 0;
                buf = (char *) malloc(len);
                memcpy(buf, buff, len);
                printf("\n read len %d\n %s",len, buf);
                free(buf);
             }
        }

    }
    return 0;
}

它似乎没有正常工作 - 在每个正确的数据后我输出了很多垃圾,但我不知道它来自哪里。所以即时寻求帮助。

事先提前

1 个答案:

答案 0 :(得分:1)

如果至少有MAX_BUFF_SIZE字节可用,则len将设置为MAX_BUFF_SIZEbuff[len]将写入buff的结尾。之后,所有赌注都已关闭。您可以将MAX_BUFF_SIZE - 1传递给read()

来解决此问题

然而,更令人担忧的是,您没有在\0来电中复制memcpy(),因为包括 \0的字节数为{{ 1}}。

我们正在接受它:

    来自len + 1
  • don't cast the return
  • 检查malloc()的回复不是malloc()
  • 如果NULL错误,您仍在查看poll()字段,该字段将不再适用
  • 您的测试revents可以更好地编写if ( ((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI) ),但无论如何都不需要,因为您已经要求if (fdinfo[0].revents & (POLLIN | POLLPRI))仅查找这两项内容