Odblokovani procesu

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Květen 13 21:25:31 CEST 2000


On Fri, 12 May 2000, Jaroslav Honsa wrote:

> Situace se mi nejak zkomplikovala. Pouzil jsem select podle rady Petra
> Novotneho, ale kdyz prerusim spojeni, socket zustane zablokovany nebo co a
> pise mi to porad timeout. Kod vypada takhle:
...
> result = select(FD_SETSIZE, &input, (fd_set *)0, (fd_set*)0, &timeout);

a kde nastavujete input? to byste mel pred kazdym volanim select(),
protoze to select() meni...zrejme se pri prvnim neuspechu input vynuluje
a vy uz to nevratite zpatky, takze to uz musi pokazde skoncit s nulou

> No a varianta s alarmem vypada takhle:
...
> void kdyz_alarm()
> {
>         printf("Nastala chyba prenosu");
>         tout_flag = 1;
> }

printf v signal handleru neni zrovna dobry napad (existuje oficialni
seznam funkci, ktere je bezpecne volat v signal handlerech, ale ted nevim,
kde se da najit...mozna v Single User Spec, mozna v infu ke glibc)

> ... Rika, ze standartne na Linuxu, jestlize mam nejakou obsluznou
> funkci volanou pres funkci signal(2), bude systemove volani po
> prichodu definovaneho signalu preruseno, jinak se pouze restartuje.

semantika signal() je trochu zmatena, protoze v puvodnim unixu se to
chovalo nejak a v BSD to zmenili na neco trochu lepsiho, ovsem opomneli
zmenit i jmeno funkce (presne podle poucky, ze nejhorsi veci se pachaji
s temi nejlepsimi umysly :> )

kdyz chcete nastavovat signaly, tak je lepsi pouzit sigaction()

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux