[질문]솔라리스에서 dev/poll 사용시 ioctl 에러 발생

paraline의 이미지

솔라리스에서 dev/poll을 사용하여 서버 프로그래밍을 하고 있습니다.

if((wfd = open("/dev/poll", O_RDWR)) < 0)
{
	perror("/dev/poll open failed!");

	return FALSE;
}

struct pollfd fd[1];
fd[0].fd = fd;
fd[0].events = POLLIN;
fd[0].revents = 0;

if(write(wfd, (const void *)&fd[0], sizeof(struct pollfd) * 1)
		!= sizeof(struct pollfd) * 1)
{
	perror("m_Wfd write failed!");

	return FALSE;
}

dopoll.dp_timeout = ms;
dopoll.dp_nfds = max; 
dopoll.dp_fds = pollfds;

result = ioctl(wfd, DP_POLL, &dopoll); 

if(result < 0)
{ 
	perror("/dev/poll ioctl DP_POLL failed"); 
	exit(-1); 
} 

평상시에는 잘 작동하다가, 클라이언트가 많이 접속했을때, ioctl이 -1을 리턴합니다. 그때 perror로 찍어보면 "Bad File Number"라고 나옵니다(EBADF).

분명히 wfd도 성공적으로 open했고, fd도 제대로 생성이 됐는데, 왜 이런 에러가 발생하는걸까요?

paraline의 이미지

혹시,
wfd = open("/dev/poll", O_RDWR);
이 루틴을 멀티쓰레드 환경에서 사용할 경우, wfd가 겹칠 경우가 있나요?
그렇다면, 멀티쓰레드 환경에서는 open하기전에 lock을 걸어야 하는지요?

좌절금지!!!
피할수 없다면 즐겨라.