Portál AbcLinuxu, 13. května 2025 21:40

Dotaz: Cekani procesu na signal

22.4.2008 10:38 Vladimir Duraj
Cekani procesu na signal
Přečteno: 295×
Odpovědět | Admin
Dobry den,

delam program s vice procesy, ktere jsou synchronizovany pomoci signalu a resim problem. Typicky usek kodu meho programu je tento:

// cekani na signal SIGUSR1
sigemptyset(&block_mask);
sigaddset(&block_mask, SIGUSR1);
sigprocmask(SIG_BLOCK, &block_mask, &old_mask);
while (!usr1_go)
{
  sigsuspend(&old_mask);
}
sigprocmask(SIG_UNBLOCK, &block_mask, NULL);
usr1_go = 0;

a jeste obsluha preruseni SIGUSR1:

void sigusr1(int sig)
{
  usr1_go = 1;
}

Je to pozastaveni procesu a jeho cekani na prichod signalu SIGUSR1. Ja bych ale potreboval, aby program cekal jak na signal SIGUSR1, tak SIGUSR2 a na zaklade prichodu jednoho z techto dvou signalu by nejak pokracoval (if - else). Impementace tohoto problemu me vsak nenapada, muzete mi prosim poradit? Dekuji.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.4.2008 13:18 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Cekani procesu na signal
Odpovědět | | Sbalit | Link | Blokovat | Admin
skúste urobiť niečo z nasledovného
sigaddset (&block_mask, SIGUSR2);

void sigusr1 (int sig) { sig_go = 1; }
void sigusr2 (int sig) { sig_go = 2; }
22.4.2008 13:55 pepe
Rozbalit Rozbalit vše Re: Cekani procesu na signal
Odpovědět | | Sbalit | Link | Blokovat | Admin
s tim blokovanim a odblokovanim SIGUSR1, opravdu to potrebujes? jinak sigaction() (pripadne signal()) je to co hledas :) Ja bych to udelal tak (za predpokladu, ze muzu klidne prerusit beh programu), ze pomoci sigaction() navesim stejnej handler na SIGUSR1 i SIGUSR2 a v tom handleru se rozhodnu, co chci delat. Pripadne muzes zablokovat oba signaly do doby, nez se ti hodi zavolat handler.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.