2013-07-12 1 views
0

다른 스레드에서 동일한 fd를 쓰고 싶습니다. 그것은 가능한가? select에서 fdset 이벤트를 가져올 수 없습니다.다른 스레드의 동일한 fd에서 'select'를 선택하십시오.

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

+0

파일을 참조하는 디스크립터를'select'에 건네도 아무 일도하지 않습니다. 파일은 항상 읽고 쓸 준비가되어 있습니다. –

답변

2

fd[0] 오픈 읽기 전용 (O_RDONLY),하지만 당신은 그것에 write()에 노력하고 있습니다. 당신이 EBADF 함께 실패하는 이유입니다.

관련 문제