Unix - статьи



         

Процессы и потоки - часть 7


int main(int argc, char * argv[]) { int i, pid; struct sigaction sa; sa.sa_handler = child_handler; sigaction(SIGCHLD, &sa, 0); for (i = 0; i < 10; i++) { pid = fork(); if (pid == 0) { printf("I will leave no zombie\n"); exit(0); } else printf("Created a process with the PID %i\n", pid); } while (1) sleep(1); return EXIT_SUCCESS; }

Программа nozombies устанавливает обработчик сигнала SIGCHLD (функция

child_handler()): void child_handler(int i) { int status; wait(&status); }

Далее программа создает несколько дочерних процессов, каждый из которых выводит диагностическое сообщение и завершает свою работу. Затем программа nozombies переходит в бесконечный цикл (так что завершать ее придется с помощью Ctrl-C). Пока программа находится в бесконечном цикле, вы можете проверить, оставила ли она процессы-зомби. Для этого откройте другой терминал и скомандуйте ps –al

Для сравнения, закомментируйте строку wait(&status);

в теле функции child_handler(), перекомпилируйте и снова запустите программу. Теперь команда ps –al покажет наличие десяти зомби-процессов (они помечены символом Z).

Интерфейс функций exec* может показаться слишком сложным и, для многих задач, избыточным. Стандарт языка C включает описание функции system(), предназначенной для запуска внешних программ. Единственный аргумент этой функции – строка запуска программы. Поскольку для выполнения программы функция system() запускает копию оболочки (той, которая в вашей системе вызывается командой sh(1)), эта функция выполнит любую команду, которую вы могли бы ввести в командной строке оболочки. Функция system() (пример ее использования вы найдете в файле system.c) приостанавливает выполнение вызвавшей ее программы до тех пор, пока дочерний процесс не завершит работу и возвращает код завершения процесса.

Программируя управление процессами, мы часто идем по лезвию бритвы. Нет, дело тут вовсе не в ужасных зомби, а в том, что трудно заставить работать слаженно два независимых процесса. Труднее этого может быть только программирование потоков, которым мы и займемся в следующий раз.




Содержание  Назад  Вперед