Linux中使用select实现关于I/o阻塞的问题出现了bug,不知道什么意思?

clipboard.png
下面是关于select的代码

clipboard.png
有错吗???
全部的代码:

include<fcntl.h>

include<stdio.h>

include<unistd.h>

include<stdlib.h>

include<time.h>

int main(void)
{

int fds[2];
char buf[7];
int i, rc, maxfd;
fd_set inset1, inset2;
struct timeval{
    long tv_sec;
    long tv_unsec;
} tv;
if ((fds[0] = open("hello1", O_RDWR | O_CREAT, 0666)) < 0)
    perror("open hello1");
if ((fds[1] = open("hello2", O_RDWR | O_CREAT, 0666)) < 0)
    perror("open hello2");
if ((rc = write(fds[0], "hello!\n", 7)))
    printf("rc=%d\n", rc);
lseek(fds[0], 0, SEEK_SET);
maxfd = fds[0] > fds[1] ? fds[0] : fds[1];
FD_ZERO(&inset1);
FD_SET(fds[0], &inset1);
FD_ZERO(&inset2);
FD_SET(fds[0], &inset2);
tv.tv_sec = 2;
tv.tv_unsec = 0;
while (FD_ISSET(fds[0], &inset1) || FD_ISSET(fds[1], &inset2)) {
    if (select(maxfd + 1, &inset1, &inset2, NULL, &tv) < 0)
        perror("select");
    else {
        if (RD_ISSET(fds[0], &inset1)) {
            rc = read(fds[0], buf, 7);
            if (rc > 0) {
                buf[rc] = '\0';
                printf("read:%s\n", buf);
            }
            else
                perror("read");
        }
        if (RD_ISSET(fds[1], &inset2)) {
            rc = write(fds[1], buf, 7);
            if (rc > 0) {
                buf[rc] = '\0';
                printf("rc=%d,write:%s\n", rc, buf);
            }
            else
                perror("write");
            sleep(10);
        }
    }
}
exit(0);

}

阅读 2.9k
1 个回答

这里timeval是你自己定义的结构,直接struct timeval tv;即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题