LINUX.ORG.RU
Ответ на: комментарий от Deleted

[почитал маны] как всё сложно :( может знаете какие-нить хорошие туториалы (мало ли лежат где в букмарках)?

я, если честно, надеялся отделаться recv :) даже придумал схему с двумя форками, в одном из которых таймер крутится

ferhiord ★★
() автор топика
Ответ на: комментарий от Deleted

В man select есть очень простой пример.

Увы ничего нет :(

$ man 3 select | grep EXAMPLES -A 1
EXAMPLES
       None.

Вот кажется этот пакет с манами:

$ pacman -Qs ^man-pages$
local/man-pages 3.23-1 (base)
    Linux man pages
ferhiord ★★
() автор топика
Ответ на: комментарий от Deleted

Тут есть.

Да что же всё не так-то :(

This page contains the following errors:

error on line 2 at column 2: StartTag: invalid element name
Below is a rendering of the page up to the first error.
ferhiord ★★
() автор топика
Ответ на: комментарий от ferhiord

К сожалению да. Все действительно очень сложно.
В твоем примере конечно можно обойтись select/poll/epoll, как уже советовали, но представь более общую задачу.
Исходя из моего опыта, в UNIX вообще сложно с ограничением времени выполнения произвольных операций (хотя бы просто системных вызовов).

Ну например ты форкаешь из одного процесса N потомков, для каждого из которых задан свой таймаут, за который он должен завершиться.
Если не завершился, то потомка нужно убить.
Попробуй надежно реализовать такую схему. Узнаешь много интересного :)

Krivenok_Dmitry
()
Ответ на: комментарий от Krivenok_Dmitry

Исходя из моего опыта, в UNIX вообще сложно с ограничением времени выполнения произвольных операций (хотя бы просто системных вызовов).

А где это просто?

Deleted
()
Ответ на: комментарий от Krivenok_Dmitry

>Исходя из моего опыта, в UNIX вообще сложно с ограничением времени выполнения произвольных операций (хотя бы просто системных вызовов).

Создай таймер

Boy_from_Jungle ★★★★
()

поставь таймер, используй non-blocking io, юзай ивенты(удобнее всего через libev(заодно кросс-платформенно).

true_admin ★★★★★
()

int xrecv(int sock, void * buf, int len, int milliseconds) {
fd_set fds;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(sock,&fds)
tv.tv_sec = 0;
tv.tv_usec = milliseconds * 1000;
int t = select(sock,&fds,NULL,NULL,&tv);
if (t) return recv(sock,buf,len,0);
return -1;
}

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi
> int t = select(sock,&fds,NULL,NULL,&tv);
> if (t) return recv(sock,buf,len,0);

Семееен Семеееныч...

1) tv.tv_sec = milliseconds % 1000; Ибо кто знает, что юзеру в голову придёт. Может, он не готов к такой засаде. 2) «nfds is the highest-numbered file descriptor in any of the three sets, plus 1» (c) man 3) А если select() вернет ошибку?

bibi
()
Ответ на: комментарий от Krivenok_Dmitry

Странная какая то схема. pthread_timedjoin_np если потоки, массив пидов + SIGKILL если процессы, не?

vasily_pupkin ★★★★★
()
Ответ на: комментарий от bibi

Да как бы пофиг. ТС все равно за услуги не платил. Коли платил бы - было бы оформлено, оттестено и так далее :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> Да как бы пофиг. ТС все равно за услуги не платил. Коли платил бы - было бы оформлено, оттестено и так далее :-)

Вот так вот и рождаются оперсорсные проекты. А потом плачем..

bibi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.