0

他のスレッドから同じ 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>

メインでは、上記のスレッドから同じ fd が設定されている場合、読み取るものはありません。

    int main()
    {
        int fd[2];
        int i;
        int n;
        int 状態;
        char buf[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); } }

4

1 に答える 1

2

fd[0]は読み取り専用 (O_RDONLY) で開いていますが、それをしようとしwrite()ています。そのため、EBADF で失敗します。

于 2013-07-12T12:16:13.650 に答える