Основы многозадачности в Linux
Вы уже знаете, что многозадачность в Linux построена на процессах, которые образуют иерархию, называемую деревом процессов, а во главе этой иерархии находится процесс init. Также упоминалось, что процесс, порождающий другой процесс, называется родителем или родительским процессом, а порожденный процесс называется потомком. Теперь пришла пора опробовать все это на практике.
Темы:
Реализация многозадачности с использованием библиотечной функции system().
Древовидная иерархия процессов в Linux.
Способы получения информации о процессе.
Библиотечный подход: system()
Самый простой способ породить в Linux новый процесс — вызвать библиотечную функцию system(), которая просто передает команду в оболочку, на которую ссылается файл /bin/sh. Функция system() объявлена в заголовочном файле stdlib.h следующим образом:
int system (const char * COMMAND);
Рассмотрим пример (листинг 9.1), демонстрирующий работу функции system().
Листинг 9.1. Пример system1.c
#include
int main (void)
{
system ("uname");
return 0;
}
Вот что получилось:
$ gcc -o system1 system1.c
$ ./system1
Linux
Рассмотрим еще один пример вызова функции system() (листинг 9.2)
Получилось следующее:
$ gcc -o system2 system2.c
$ ./system2
end-of-program
Эта программа раскрывает следующие две особенности функции system():
system() ожидает завершения переданной ей команды. Поэтому сообщение "endof-program" выводится на экран примерно через 5 с;
в system() можно передавать не только имя программы, но и аргументы.
Предыдущий пример можно изменить таким образом, что функция system() не будет дожидаться выполнения программы (листинг 9.3).
Листинг 9.3. Пример system3.c
#include
#include
int main (void)
{
system ("sleep 5 &");
fprintf (stderr, "end-of-program\n");
return 0;
}
В этом примере функция system() передает в оболочку /bin/sh команду запуска программы в фоновом режиме. Поэтому сообщение "end-of-program" выводится без 5-секундной паузы.
Наконец, можно удостовериться, что аргумент функции system() действительно передается в оболочку. Для этого спровоцируем /bin/sh на вывод ошибки:
system ("cd abrakadabra");
Запустив программу, мы увидим примерно следующее:
$ ./system3
sh: line 0: cd: abrakadabra: No such file or directory
end-of-program
Итак, с аргументом COMMAND все понятно. Но что возвращает сама функция system()? Это число называется статусом завершения потомка.
Достарыңызбен бөлісу: |