Ir zināms, ka dakša () sistēmas izsaukums tiek izmantots, lai izveidotu jaunu procesu, kas kļūst par zvanītāja procesa atvasinājumu.
Izejot, bērns atstāj izejas statusu, kas jāatdod vecākiem. Tātad, kad bērns pabeidz, tas kļūst par a zombijs .
Ikreiz, kad bērns iziet vai apstājas, vecāks tiek nosūtīts a SIGCHLD signāls.
Vecāks var izmantot sistēmas izsaukumu wait() vai waitpid() kopā ar makro WIFEXITED un WEXITSTATUS, lai uzzinātu par apturētā atvasinājuma statusu.
(*)wait() sistēmas izsaukums: tas aptur izsaukšanas procesa izpildi, līdz tiek pārtraukts viens no bērniem.
Gaidīšanas() sistēmas izsaukuma sintakse:
pid_t wait(int *status);
(*) Sistēmas izsaukums waitpid() : tas aptur izsaukšanas procesa izpildi, līdz pid argumentā norādītais bērns ir mainījis stāvokli.
Waitpid() sistēmas izsaukuma sintakse:
pid_t waitpid(pid_t pid int *status int options)
Piezīme. Pēc noklusējuma waitpid() gaida tikai pārtrauktos bērnus, taču šo darbību var mainīt, izmantojot opciju argumentu, piemēram, WIFEXITED WEXITSTATUS utt.
Pid vērtība var būt:
- Mazāk nekā -1: tas nozīmē, ka jāgaida jebkurš pakārtots process, kura procesu grupas ID ir vienāds ar pid absolūto vērtību.
- Vienāds ar -1 : tas nozīmē, ka jāgaida jebkurš pakārtotais process.
- Vienāds ar 0 : tas nozīmē, ka jāgaida jebkurš pakārtots process, kura procesu grupas ID ir vienāds ar izsaukšanas procesa ID.
- Lielāks par 0: tas nozīmē gaidīt bērnu, kura procesa ID ir vienāds ar pid vērtību.
WIFEXITED un WEXITSTATUS ir divas no iespējām, kuras var izmantot, lai uzzinātu bērna izejas statusu.
WIFEXITED(statuss) : atgriež patiesu, ja bērns tiek pārtraukts normāli.
WEXITSTATUS(statuss): atgriež bērna izejas statusu. Šis makro ir jāizmanto tikai tad, ja WIFEXITED ir atgriezts patiess.
Zemāk ir C ieviešana, kurā bērns izmanto excl() funkcija, bet execl() norādītais ceļš nav definēts.
Apskatīsim, kāda ir vecāku iegūtā bērna izejas statusa vērtība.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
Izvade:

Piezīme: Iepriekš minētais kods var nedarboties ar tiešsaistes kompilatoru, jo fork () ir atspējots.
Šeit izejas statuss ir 127, kas norāda, ka ir kāda problēma ar ceļu vai drukas kļūda.
Tālāk ir norādīti daži izejas statusa kodi, lai iegūtu papildu informāciju.
- 1 : dažādas kļūdas, piemēram, “dalīt ar nulli” un citas nepieļaujamas darbības.
-
2: trūkst atslēgvārda, komandas vai atļaujas problēma. - 126: Atļaujas problēma vai komanda nav izpildāma
- 128: nederīgs arguments, lai izietu.
Piezīme: C standarts nedefinē atgriešanas kodu nozīmi. Atgriešanas kodu izmantošanas noteikumi dažādās platformās atšķiras.