管道读取时不阻塞的问题
创建了命名管道,一个读取,一个写入
读取的部分,在open时阻塞,这个没问题
这时,写入进程向管道写入数据
读取进程继续执行,读到数据。
但,问题来了,读到一次数据之后,在没有数据的情况下,read不阻塞。
被逼无奈,添加了select,可它还是不阻塞
为什么呢?
求助!
- C/C++ code
cmdfd = open(WEBER_CMD_PIPE, O_RDONLY); while(group.running) { timeout.tv_sec = 5; timeout.tv_usec=0; FD_ZERO(&rfds); FD_SET(cmdfd, &rfds); ret = select(cmdfd+1, &rfds, NULL, NULL, &timeout); if (ret == -1) perror("select()"); else if (ret) { Printf("ret: %d\n",ret); if (FD_ISSET(cmdfd, &rfds) ) { printf("Data is available now.\n"); ret = read(cmdfd, cmd, MAX_CMD_LEN); //ret = fgets(cmd,MAX_CMD_LEN,cmdfd); //ret = 10; if (ret > 0) { Printf("cmdlen: %d,cmd:\n%s", ret, cmd); jv_cmd_system(cmd); } } } else printf("timeout.: %d, %s\n",ret,strerror(errno)); }[解决办法]
- C/C++ code
flag = fcntl(cmdfd, F_GETFL, 0);flag &= ~O_NONBLOCK;fcntl(cmdfd, F_SETFL, flag);