Select `从另一个线程在同一fd上选择`

Select `从另一个线程在同一fd上选择`,select,pthreads,Select,Pthreads,我想从其他线程写相同的fd。可能吗?我无法在select上获取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)

我想从其他线程写相同的fd。可能吗?我无法在select上获取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,则没有任何内容可读取。 int main() { int-fd[2]; int i; int n; int状态; char-buf[255]; fd_设置读FDS、写FDS; pthread\u t线程

if((fd[0]=open(“./testfile”,O_RDONLY))=-1)
{
perror(“文件打开错误:”);
出口(0);
}
如果((fd[1]=open(“./testfile2”,仅限O_RDONLY))=-1)
{
perror(“文件打开错误:”);
出口(0);
}
pthread_create(&thread,NULL,&thread_main,(void*)fd);
memset(buf,0x00255);
对于(;;)
{
FD_零(&readfds);
FD_集(FD[0],&readfds);
FD_集(FD[1],&readfds);
state=select(fd[1]+1,&readfds,NULL,NULL,NULL);
开关(状态)
{
案例1:
perror(“选择错误:”);
出口(0);
打破
违约:
对于(i=0;i<2;i++)
{
if(FD_ISSET(FD[i],&readfds))
{
而((n=read(fd[i],buf,255))>0)
printf((%d)[%d]%s],状态,i,buf);
}
}
memset(buf,0x00255);
打破
}
usleep(1000);
}
}  

fd[0]
是只读(O_RDONLY)打开的,但您正在尝试对其执行
write()
操作。这就是为什么使用EBADF失败的原因。

将引用文件的描述符传递给
选择
没有任何作用。文件总是可以读取也可以写入。 int main() { int fd[2]; int i; int n; int state; char buf[255]; fd_set readfds, writefds; pthread_t thread;

    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);
    }
}