prijem ctrl-c pres soket

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Prosinec 10 22:24:41 CET 2005


On Fri, 9 Dec 2005, Michal Vojan wrote:

> tomu bych jeste rozumel. mozna jsem to spatne napsal, ja bych se rad
> dozvedel, kde se veme ten podnet, ten signal, na ktery mam reagovat, proc
> neprichazi. 
[...]
> (void) setsockopt(server_sock_fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on,
> sizeof on);

Myslite, ze je nejak moc smysluplne chytat OOB data pres signal, kdyz jste
timto nastavil, aby se poslusne zaradila do fronty mezi normalni data?

> signal(SIGIO,&catchSIGIO);
> signal(SIGURG,&catchSIGURG);    // tenhle signal by mel prijit pri prichodu
> onech out-of-band dat

Nastavovat handlery signaly byste mel predtim, nez aktivujete vyvolavani 
toho signalu (mluvim o nastaveni FASYNC...tedy ono by se tomu melo rikat 
spis O_ASYNC, FASYNC je takova bsdickova manyra, a F_SETOWN).

Take byste mel spis pouzit sigaction().

> pid = -getpid();
> if (ioctl(server_sock_fd, SIOCSPGRP, (char *) &pid) < 0) {
>     perror("ioctl: SIOCSPGRP");
> }

Tohle je trochu nadbytecne, kdyz uz tam mate fcntl(...F_SETFL...), ne?
Hlavne to tim otocite na hlavu, protoze nejdriv nastavujete proces a ted 
skupinu procesu (tedy za predpokladu, ze zrovna tenhle proces se 
osamostatni a zridil si skupinu, ktera ma prave cislo odpovidajici jeho 
pidu).

> problem je, ze zadnej signal mi neprijde. kdyz na ten program pustim strace
> tak tam vidim tohle
> read(6, "\377", 1)                      = 1
> read(6, "\364", 1)                      = 1
> read(6, "\377", 1)                      = 1
> read(6, "\375", 1)                      = 1
> read(6, "\6", 1)                        = 1
> 
> tedy ta sekvence prijde. tady se to ale zastavi a ceka a teprve az kdyz
> zmacknu enter, tak to bezi dal. signal nikde zadny.
> co tomu tedy jeste chybi?

Treba tomu chybi to, aby klient (rozumej telnet) vubec poslal nejaka
urgentni (= OOB) data. Viz telnet(1).

U SIGIO nevim, ale mam jiste podezreni, ze by nemuselo chodit, kdyz uz 
proces na prislusnem deskriptoru sedi a ceka na prislusnou udalost
(tedy napriklad ceka na prichozi data a je uvnitr volani read()).
Ale treba se mylim.


--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