如何在C中将阻塞文件io转换为非阻塞

时间:2013-05-29 12:33:05

标签: c asynchronous io nonblocking

我正在编写代码,通过C中的套接字发送终端命令的输出。我尝试使用select进行异步读取并避免阻塞事件循环,但是我没有成功。

如何更改此代码以使文件流IO无阻塞?

int maxfdpl;
fd_set rset;
char sendline[100], recvline[100], my_msg[100];
FILE *in;
char str[30]="ping 192.168.26.219";
if(!(in = popen(str, "r"))){
   return EXIT_FAILURE;
}
FD_ZERO(&rset);
FD_SET(fileno(in), &rset);
maxfdpl =fileno(in) + 1;
select(maxfdpl, &rset, NULL, NULL, NULL);
while(1) {
      if (FD_ISSET(fileno(in), &rset)) {
         if (fgets(sendline, 100, in)) {
            send_over_socket(sendline);
         }
      }
}

如何删除while循环(阻塞事件循环)并用非阻塞IO操作替换代码?

1 个答案:

答案 0 :(得分:0)

int blockFD(int fd, int blocking)
{
    /* Save the current flags */
    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1)
        return 0;

    if (blocking)
        flags &= ~O_NONBLOCK;
    else
        flags |= O_NONBLOCK;

    return fcntl(fd, F_SETFL, flags) != -1;
}

如果失败则返回0。