logo

Излазни статус подређеног процеса у Линуку

Познато је да виљушка () системски позив се користи за креирање новог процеса који постаје потомак процеса позиваоца. 
По изласку дете оставља излазни статус који треба вратити родитељу. Дакле, када дете заврши, постаје а зомби .
Кад год дете изађе или стане, родитељу се шаље а СИГЦХЛД сигнал. 
Родитељ може да користи системски позив ваит() или ваитпид() заједно са макроима ВИФЕКСИТЕД и ВЕКСИТСТАТУС са њима да сазна о статусу свог заустављеног детета.
(*)ваит() системски позив : суспендује извршење позивајућег процеса док се једно од његових деце не заврши. 
Синтакса системског позива ваит(): 

pid_t wait(int *status);


(*)Системски позив ваитпид() : суспендује извршење позивајућег процеса све док дете наведен аргументом пид не промени стање. 
Синтакса ваитпид() системског позива: 

pid_t waitpid(pid_t pid int *status int options)


Напомена: Подразумевано ваитпид() чека само на прекинуту децу, али ово понашање се може променити преко аргумента опција као што је ВИФЕКСИТЕД ВЕКСИТСТАТУС итд.
Вредност пид може бити: 
 



  1. Мање од -1 : значи сачекајте било који подређени процес чији је ИД групе процеса једнак апсолутној вредности пид-а.
  2. Једнако са -1 : значи чекати било који подређени процес.
  3. Једнако 0 : значи чекање за било који подређени процес чији је ИД групе процеса једнак оном процеса који позива.
  4. Веће од 0 : значи чекати дете чији је ИД процеса једнак вредности пид-а.


ВИФЕКСИТЕД и ВЕКСИТСТАТУС су две опције које се могу користити за сазнање излазног статуса детета. 
ВИФЕКСИТЕД(статус) : враћа тачно ако је дете нормално прекинуто.
ВЕКСИТСТАТУС(статус) : враћа излазни статус детета. Овај макро би требало да се користи само ако је ВИФЕКСИТЕД вратио труе.
Испод је Ц имплементација у којој дете користи екцл() али је путања наведена за екецл() недефинисана. 
Хајде да видимо која је вредност излазног статуса детета коју добија родитељ.

C
// 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; } 

Излаз: 
 

Излазни статус подређеног процеса у Линуку
 

Напомена : Горе наведени код можда неће радити са онлајн компајлером јер је форк() онемогућен.
Овде је излазни статус 127 што указује да постоји неки проблем са путањом или грешка у куцању.
Неколико излазних статусних кодова је наведено испод за додатне информације: 
 

  • 1 : Разне грешке као што је 'дељење са нулом' и друге недозвољене операције.

  • 2 : Недостаје кључна реч или команда или проблем са дозволом.
  • 126 : Проблем са дозволама или команда није извршна
  • 128 : неважећи аргумент за излаз.


Напомена: Ц стандард не дефинише значење повратних кодова. Правила за коришћење повратних кодова се разликују на различитим платформама.
 

Креирај квиз