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);
}
}
파일을 참조하는 디스크립터를'select'에 건네도 아무 일도하지 않습니다. 파일은 항상 읽고 쓸 준비가되어 있습니다. –