C语言 文件*读取超时



我正在制作一个通信库,该库采用文件流并使用它进行读写。协议定义了超时,所以我想使用它们。

我使用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()返回的文件指针。

相关内容

  • 没有找到相关文章

最新更新