我正在制作一个通信库,该库采用文件流并使用它进行读写。协议定义了超时,所以我想使用它们。
我使用fread(3)
和fwrite(3)
。我听说过select(2)
,这就是我正在寻找的,除了它使用文件描述符而不是libc文件流-我想支持用fopencookie(3)
创建的自定义文件流,这对测试和其他事情也很有用。我试过用alarm(2)
设置SIGALRM
以从fread(3)
获得EINTR
错误(使用signal(2)
为SIGALRM
设置回调),但它不会像预期的那样停止fopen
调用…
提前感谢您的任何解决方案。
EDIT:所以它看起来像这样工作。但只有一次。在第二次通话中,它没有…Oo
/**
* sigalrm_handler:
* Shut up SIGALRM.
*
* @arg code signal code (always SIGALRM)
*/
static __thread jmp_buf env_alrm;
static void sigalrm_handler(int signo)
{
(void)signo;
/* restore env */
longjmp(env_alrm, 5);
}
/**
* _p7_fread:
* Read file with timeout.
*
* @arg ptr the buffer pointer
* @arg size the size of an item
* @arg nitems the number of items in the buffer
* @arg stream the stream
* @arg timeout the timeout (seconds)
* @return the number of read bytes
*/
size_t _p7_fread(void *ptr, size_t size, size_t nitems, FILE *stream,
int timeout)
{
size_t read_count = 0;
/* set long jump */
int val = setjmp(env_alrm);
if (!val) {
/* setup signal handler */
if (signal(SIGALRM, &sigalrm_handler) == SIG_ERR)
return (0);
/* setup alarm */
alarm(timeout);
/* read */
read_count = fread(ptr, size, nitems, stream);
} else
errno = EINTR;
/* unset signal handler and alarm */
signal(SIGALRM, NULL);
alarm(0);
/* return */
return (read_count);
}
再次感谢您的帮助^^
函数:fdopen()
将从文件描述符中获取文件指针。
然后,您可以使用函数:select()
和从fdopen()
返回的文件指针。