ソケットセレクトで-1を返しています。しかし、これは、sybaseデータベースの新規インストールを使用している場合にのみ発生します。このコードを古いデータベースで使用すると、ソケット選択エラーが発生せず、すべて正常に動作します。 65,000を超える、例えば以下how_many = 2、及びそれがfile_limits.rlim_curに動作するとき、次のコードで新しいデータベースfile_limits.rlim_curとが256であることに留意することがtimeout_secs = 60C Solarisでソケット選択エラーが発生しました
重要で
=とソケットselectは-1を返します。私は256に選択するの最初のパラメータをハードコーディングしようとしましたが、それでも-1を返します。
int socket_activity(int how_many, int *fd, int timeout_secs)
{
int i;
int select_fd;
fd_set read_fds;
fd_set except_fds;
struct timeval timeout;
struct rlimit file_limits;
/*
** Determine the current limits.
*/
if (getrlimit(RLIMIT_NOFILE, &file_limits) != 0)
return(-1);
/*
** Set up the select structures. Initialize the timeout to the specified
** seconds. Only non-negative file descriptors are initialized.
*/
FD_ZERO(&read_fds);
FD_ZERO(&except_fds);
for (i = 0; i < how_many; i++)
if (fd[i] >= 0) {
FD_SET(fd[i], &read_fds);
FD_SET(fd[i], &except_fds);
} /* of if */
timeout.tv_sec = timeout_secs;
timeout.tv_usec = 0;
/*
** Perform the select and check on the results.
*/
select_fd = select(file_limits.rlim_cur,
&read_fds,
NULL,
&except_fds,
&timeout);
if (select_fd > 0) {
/*
** Scan the list of file descriptors and return which file
** descripitor show activity. Only check non-negative file descriptors.
*/
for (i = 0; i < how_many; i++)
if ((fd[i] >= 0) &&
(FD_ISSET(fd[i], &read_fds)))
return(fd[i]);
/*
** No file descriptor showed activity so return zero to indicate
** that a timeout occured.
*/
return(0);
} /* of if */
else
/*
** Simply return the return value from select (the function will
** return a 0 on timeout or a -1 on error).
*/
return(select_fd);
} /* of function */
あなたの 'for'ループはどこかにかっこを入れていると思いますか? – yano
'select'が-1を返す場合、' perror'を呼び出して失敗した理由を調べるべきです。 – dbush
おそらくあなたは 'FD_SETSIZE'を行ったでしょうか? http://stackoverflow.com/questions/7976388/increasing-limit-of-fd-setsize-and-select –