Wpis z mikrobloga

Wrzucam raz jeszcze, bo chyba coś tagi nie podziałały :(

Mirki programistyczne!

Poranne zadanko!
Tym razem sleepy i kille :D

Generalnie nie wiem, czemu podane są wartości p1 i p2 - ma to w ogóle jakieś znaczenie?
Pytanie jest: jakie będą wartości x, y i z po zakończeniu programu? (pominę fakt, że program mi zabija całe Ubuntu po 20 sekundach xD)

Wg. moich skromnych notatek wyglądać to będzie tak:

p2 - parent ID
p1 - 1341
x - parent ID
y - parent został zabity, więc ID Shella?
z - ID potomka

Dobrze myślę?

#programowanie #pytaniedoeksperta #informatyka #linux
crushyna - Wrzucam raz jeszcze, bo chyba coś tagi nie podziałały :(

Mirki programi...

źródło: comment_AuXBO0RNWoSTF6ILcIiXbvYw6HI5E21L.jpg

Pobierz
  • 16
  • Odpowiedz
@crushyna: a ten kill(x, 9) nie ubija czasem procesu rodzica dla bieżącego procesu czyli procesu shella?

weź sobie zakomentuj tą linię z kill i sprawdź co Ci zwróci ta linia z print (x);
jeśli nr procesu shella to kiepsko, jak 1 to w ogóle tragedia, ewentualnie będzie nr jakiegoś daemona.
  • Odpowiedz
a ten kill(x, 9) nie ubija czasem procesu rodzica dla bieżącego procesu czyli procesu shella?


@franekfm: p1==0 jest dla procesu potomnego, więc getppid() wykonuje się tylko dla childa i pobiera pid procesu rodzica (lub 1 jeśli parent sie skończył).

y - parent został zabity, więc ID Shella?


@crushyna: O ile mi wiadomo, to jeśli parent się kończy, to procesy potomne są przypisywane bezpośrednio do procesu init, którego pid == 1,
  • Odpowiedz
@zakopiak: no to zgodnie z tym w X powinieneś mieć PID rodzica, Y to 1 a Z to PID dziecka - ale to printf z procesu dziecka bo printf wykona się dwa razy, raz dla rodzica a raz dla dziecka, dla procesu rodzica będą losowe wartości bo x, y i z nie są inicjowane.
  • Odpowiedz
@franekfm: Generalnie się zgadzam. Tylko że:

powinieneś


Bardzo ryzykowne słowo w odniesieniu do przetwarzania współbieżnego. ( ͡° ͜ʖ ͡°) W obu wątkach jest sleep(10), więc rezultat zależy od tego w jakiej kolejności wykona się reszta kodu.
  • Odpowiedz
@crushyna: i generalnie nie powinieneś robić kill na procesie rodzica. Tam gdzie pobierasz x z getppid() powinieneś także pobrać zrobić małą pętlę.

if (0 == p1)
{
x = getppid();
z = getpid();
y = x;
while (y == x)
{
sleep(10);
y = getppid();
}
}
else
  • Odpowiedz
@crushyna: no to w takim razie to jest pytanie z kategorii podchwytliwych, zobacz, ze proces rodzic ma sleep na 10 sekund a proces dziecka robi kill na procesie rodzica odczytanego po 10 sekundach.
Więc prawidłową odpowiedzią na kolokwium powinno być „Nastąpi ubicie systemu” ( ͡°( ͡° ͜ʖ( ͡° ͜ʖ ͡°)ʖ ͡°) ͡°)
  • Odpowiedz