我试图使用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;
}
它似乎没有正常工作 - 在每个正确的数据后我输出了很多垃圾,但我不知道它来自哪里。所以即时寻求帮助。
事先提前答案 0 :(得分:1)
如果至少有MAX_BUFF_SIZE
字节可用,则len
将设置为MAX_BUFF_SIZE
,buff[len]
将写入buff
的结尾。之后,所有赌注都已关闭。您可以将MAX_BUFF_SIZE - 1
传递给read()
。
然而,更令人担忧的是,您没有在\0
来电中复制memcpy()
,因为包括 \0
的字节数为{{ 1}}。
我们正在接受它:
len + 1
的malloc()
的回复不是malloc()
NULL
错误,您仍在查看poll()
字段,该字段将不再适用revents
可以更好地编写if ( ((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI) )
,但无论如何都不需要,因为您已经要求if (fdinfo[0].revents & (POLLIN | POLLPRI))
仅查找这两项内容