тайм-аут при записи () для linux канала - PullRequest
1 голос
/ 22 февраля 2020

Как установить тайм-аут для write () на linux pipe?

пример кода:

int fd_pipe = open("/run/some/pipe", O_RDWR);

// here i need to set timeout for 3 seconds somehow, if can't write, code will continue...
write(fd_pipe, something, strlen(something));

// continue executing..

спасибо

1 Ответ

2 голосов
/ 22 февраля 2020

Так же, как и для сетевых сокетов, вы можете использовать select() также на каналах, чтобы увидеть, не заблокируется ли write().

Сначала инициализируйте fdset и время ожидания:

fd_set fds;
FD_ZERO(&fds);
FD_SET(fd_pipe, &fds);
struct timeval tv = { 3, 0 }; // 3 secs, 0 usecs

Следующий вызов ожидает максимум 3 секунды (как указано в tv), чтобы канал стал доступным для записи.

int st = select(fd_pipe+1, NULL, &fds, NULL, &tv);
if (st < 0) {
    // select threw an error
    perror("select");
else if (FD_ISSET(fd_pipe, &fds)) {
    int bytes = write(fd_pipe, something, strlen(something));
} else {
    // Writing not possible in 3 seconds, wait
}

Вы, конечно, должны проверить возвращаемое значение вызова write() ( в обоих случаях, кстати), поскольку может случиться, что меньше байт, чем запрошено, было записано в канал.

...