• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Linux fork - proces potomny i macierzysty

42 Warsaw Coding Academy
0 głosów
1,019 wizyt
pytanie zadane 11 stycznia 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
Witam, czy istnieje sposób na sprawdzenie w funkcji macierzystej czy proces potomny trwa lub się zakończył ?
Musze zakończyć program i to funkcja potomna decyduje kiedy to jest, a w funkcji macierzystej mam pętlę while(1), więc może istnieje jakaś funkcja sprawdzająca istnienie funkcji potomnych ???

1 odpowiedź

0 głosów
odpowiedź 11 stycznia 2019 przez RafalS VIP (122,820 p.)
wybrane 12 stycznia 2019 przez poldeeek
 
Najlepsza
wait(NULL);

W procesie macierzystym.

https://stackoverflow.com/a/42426884

komentarz 11 stycznia 2019 przez poldeeek Mądrala (5,980 p.)
Tak, ale funkcja wait z tego co wiem chyba blokuje całkowicie proces macierzysty, a ja chciałbym aby oba stale działały. Proces macierzysty ciągle wykonuje pewne operacje i ma przestać, i zakończyć się w tym samym czasie co proces potomny..
komentarz 12 stycznia 2019 przez poldeeek Mądrala (5,980 p.)
edycja 12 stycznia 2019 przez poldeeek

Mam jeszcze pytanie. Chcę zrobić w procesie macierzystym obsługę sygnału np. SIGINT jako zakończenie procesu macierzystego.  Czy jeśli w procesie potomnym napiszę coś takiego 

			kill(getppid(), SIGINIT);
			exit(1);

 I w procesie macierzystym 
 

signal(SIGINT, sgnhandle);

i w funkcji sgnhandle po prostu wywowałam exit(1), to czy coś takiego ma prawo zadziałać ? Bo szczerze mówiąc próbuje coś takiego napisać ale nie działa i nie wiem czy ja coś źle pisze w kodzie, czy w ogóle takie rozwiązanie nie może istnieć...

komentarz 12 stycznia 2019 przez RafalS VIP (122,820 p.)

Musisz robić coś źle, bo mi to działa:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include <stdlib.h>
#include <sys/types.h>

void sig_handler(int signo){
    if(signo == SIGINT){
        printf("How could you do this to me?\n");
        exit(1);
    }
}

int main() 
{ 
    if (fork() == 0) 
    {
        // give parent some time to setup handler
        sleep(2);
        kill(getppid(),SIGINT);
        while(1) {sleep(1); printf("I'm still standing\n");}
    }
    else{
        signal(SIGINT,sig_handler);
        while(1) sleep(1);
    }
}

 

komentarz 12 stycznia 2019 przez poldeeek Mądrala (5,980 p.)
edycja 12 stycznia 2019 przez poldeeek
Dobra faktycznie działa, już zlokalizowałem błąd.
Mam jeszcze pytanie czy lepsze jest tutaj używanie funkcji signal czy sigaction ?
I czy powieninem coś podać jako argument Wait(arg), czy samo wait() wystarczy, ponieważ chcę się upewnić, że na 100% potomek zakończy się jako pierwszy, czyli po wysłaniu sygnału wykona funkcję exit(1), zanim zakończy działanie proces macierzysty.

Podobne pytania

0 głosów
1 odpowiedź 1,509 wizyt
pytanie zadane 5 grudnia 2018 w C i C++ przez profesorek96 Szeryf (91,420 p.)
+2 głosów
3 odpowiedzi 1,763 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez Wilier Bywalec (2,570 p.)
0 głosów
2 odpowiedzi 653 wizyt
pytanie zadane 1 grudnia 2016 w C i C++ przez bart1996 Początkujący (360 p.)

93,377 zapytań

142,380 odpowiedzi

322,530 komentarzy

62,727 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...