【问题标题】:`select` on same fd from another thread从另一个线程在同一个 fd 上`select`
【发布时间】:2013-07-12 11:41:30
【问题描述】:

我想从其他线程写相同的 fd。是否可以?我无法在选择时获得 fdset 事件。

在 thread_main 上,我有“错误的文件描述符。这里出了什么问题?

<pre>
void *thread_main(void *arg)
{
    int len = 0;
    int *fd = (int *)arg;
    len = write(fd[0], "a", 1);
    // I've got write...-1-9(Bad file descriptor)
    printf("write...%d-%d(%s)\n", len, errno, strerror(errno));
    len = write(fd[1], "b", 1);
    printf("write...%d-%d(%s)\n", len, errno, strerror(errno));
}
<code>

在 main 上,如果从上面的线程中设置了相同的 fd,则没有什么可读取的。

主函数() { 诠释 fd[2]; 诠释我; 诠释n; 诠释状态; 字符缓冲区[255]; fd_set readfds,writefds; pthread_t 线程; if ((fd[0] = open("./testfile", O_RDONLY)) == -1) { perror("file open error : "); exit(0); } if ((fd[1] = open("./testfile2", O_RDONLY)) == -1) { perror("file open error : "); exit(0); } pthread_create(&thread, NULL, &thread_main, (void *)fd); memset (buf, 0x00, 255); for(;;) { FD_ZERO(&readfds); FD_SET(fd[0], &readfds); FD_SET(fd[1], &readfds); state = select(fd[1]+1, &readfds, NULL, NULL, NULL); switch(state) { case -1: perror("select error : "); exit(0); break; default : for (i = 0; i < 2; i++) { if (FD_ISSET(fd[i], &readfds)) { while ((n = read(fd[i], buf, 255)) > 0) printf("(%d) [%d] %s", state, i, buf); } } memset (buf, 0x00, 255); break; } usleep(1000); } }

【问题讨论】:

  • 将引用文件的描述符传递给select 不会做任何事情。文件始终可以读取和写入。

标签: select pthreads


【解决方案1】:

fd[0] 以只读方式打开 (O_RDONLY),但您正在尝试 write() 访问它。这就是您使用 EBADF 失败的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2023-03-19
    • 2020-10-15
    • 2023-03-03
    相关资源
    最近更新 更多