Изучение основных принципов управления процессами и нитями в ОС LINUX, страница 3

       F S   UID        PID       PPID  C PRI  NI ADDR    SZ WCHAN TTY          TIME CMD

00000210 -   100     438293     380959  -  10   0    - 4676K -     ?        00:00:03 helpviewer

00000000 -   100     913453     499756  -  10   0    -  636K -     ?        00:00:00 father.out

00000000 -   100     917550     913453  -  10   0    -  636K -     ?        00:00:00 son.out

00000000 -   100     921647     917552  -  10   0    -  648K -     ?        00:00:00 ps

00000000 -   100     917552     913453  -  10   0    -  844K -     ?        00:00:00 sh

$

3.1.3. Запустить на выполнение программу father.out в фоновом режиме father &. Получить таблицу процессов, запущенных с вашего терминала (включая отцовский и сыновний процессы).

При запуске процесса, как интерактивного, он монопольно владеет терминалом. Пока такой процесс не завершит свое выполнение, пользователь не сможет работать там. При запуске в фоновом режиме для пользователя остается возможность работы в терминале, можно выполнять там команды и т.п., не ожидая завершения процесса.

В текст father.c и son.c закомментирован вывод.

$ ./father.out &

[1] 1110062

$ ps

       PID TTY          TIME CMD

    438293 ?        00:00:03 helpviewer

            …

   1110062 ?        00:00:00 father.out

   1114159 ?        00:00:00 son.out

   1118256 ?        00:00:00 ps

3.2. Взаимодействие родственных процессов.

3.2.1. Изменяя длительности выполнения процессов и параметры системных вызовов, рассмотреть 3 ситуации и вывести соответствующие таблицы процессов:
а) процесс-отец запускает процесс-сын и ожидает его завершения;
б) процесс-отец запускает процесс-сын и, не ожидая его завершения, завершает свое выполнение. Зафиксируйте изменение родительского идентификатора процесса-сына;
в) процесс-отец запускает процесс-сын и не ожидает его завершения; процесс-сын завершает свое выполнение. Зафиксируйте появление процесса-зомби.

Текст father.c для всех трех пунктов с комментариями по использованию.

#include <stdio.h>

main ()

{

      int pid, ppid,status;

      pid=getpid();

      ppid=getppid();

      printf ("\n\n FATHER PARAM: pid=%i ppid=%i \n", pid, ppid);

      if (fork()==0)

            execl("son.out","son.out", NULL);

      system ("ps -la");

      //dlya zombi raskommentirovat

      //system("pidin | grep Zombie");

      //chtobu ne jdat zaversheniya stroky zakommentirovat

      //dlya zombi zakommentirovat

      wait(&status);

}

Текст son.c для всех трех пунктов с комментариями по использованию.

#include <stdio.h>

main()

{

      int pid, ppid;

      pid=getpid();

      ppid=getppid();

      printf ("\n SON PARAM: pid=%i ppid=%i\n", pid, ppid);

      //dlya zombie zakommentirovat

      sleep(15);

}

Результаты, пункт А.

Запуск father.out.

$ ./father.out

 FATHER PARAM: pid=913453 ppid=499756

 SON PARAM: pid=917550 ppid=913453

       F S   UID        PID       PPID  C PRI  NI ADDR    SZ WCHAN TTY          TIME CMD

00000210 -   100     438293     380959  -  10   0    - 4676K -     ?        00:00:03 helpviewer

00000000 -   100     913453     499756  -  10   0    -  636K -     ?        00:00:00 father.out

00000000 -   100     917550     913453  -  10   0    -  636K -     ?        00:00:00 son.out

00000000 -   100     921647     917552  -  10   0    -  648K -     ?        00:00:00 ps

00000000 -   100     917552     913453  -  10   0    -  844K -     ?        00:00:00 sh