Создание процессов

Способ 1. Использование system.

При помощи функции system из стандартной библиотеки языка С stdlib можно выполнить команду изнутри программы, как если бы эта команда выла введена в оболочке. Команда system возвращает код возврата команды оболочки. При неудачном запуске оболочки код возврата равен 127, если произошли другие ошибки, то код возврата равен -1.

Задание 3. Выполните программу pr3.c, в которой запускается команда "ls -l /":

 

/* pr3.c */

#include <stdio.h>

#include <stdlib.h>

int main()

{

int ret_val;

ret_val = system("ls -l /");

printf("Return code is %dn", ret_val);

return ret_val;

}

Запишите в отчет код возврата функции systemпри успешном и неуспешном (задайте для ls несуществующий каталог) выполнении. Выведите код завершения программы pr3.c также и из оболочки, пользуясь соответствующей переменной оболочки (см. лабораторную работу 1).

Создание нового процесса при помощи system не следует использовать в программах, т.к. он может вести себя по-разному в разных версиях Linux.

Способ 2. Использование fork.

Основной способ создания процессов - системный вызов fork, который создает дочерний процесс, являющийся копией своего родительского процесса. При неудаче fork возвращает -1. При успешном выполнении fork возвращает 0 в созданный дочерний процесс и возвращает PID дочернего процесса в родительский процесс.

Задание 4.

4.1. Выполните следующую программу:

#include <stdio.h>

#include <unistd.h>

int main()

{

fork(); printf("An");

fork(); printf("Bn");

return 0;

}

Сколько процессов будет выполнено? Сколько сообщений будет напечатано? Нарисуйте дерево процессов. Почему приглашение оболочки $ появляется раньше, чем программа завершает работу?

4.2. Выполните программу pr4.c:

/* pr4.c */

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

pid_t child_pid;

printf("The main program process ID is %dn", getpid());

child_pid = fork();

if (child_pid !=0) {

printf ("This is the parent process, with ID %dn", getpid());

printf ("the child's process ID is %dn", child_pid);

}

else

printf ("This is the child process, with ID %dn", getpid());

return 0;

}

а) Запишите в отчет выходные данные, выведенные программой.

б) Распечатайте в дочернем процессе PID его родителя и выполните программу. Модифицируйте программу: после fork задержите выполнение родительского процесса на 3 единицы времени (при помощи библиотечной функции sleep), а дочернего - на 10 единиц. Распечатайте в дочернем процессе PID его родителя дважды: до и после sleep. Объясните в отчете полученные результаты.