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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.