Так же, как и для сетевых сокетов, вы можете использовать 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()
( в обоих случаях, кстати), поскольку может случиться, что меньше байт, чем запрошено, было записано в канал.