Основы многозадачности в Linux


Листинг 10.8. Программа execve3.c



бет10/15
Дата16.11.2022
өлшемі472,04 Kb.
#158456
1   ...   7   8   9   10   11   12   13   14   15
Байланысты:
5-6 лаб раб (1)

Листинг 10.8. Программа execve3.c

Итак, мы постепенно подошли к тому, чтобы опробовать многозадачность "во всей красе". Совместное использование системных вызовов fork() и execve() позволяет запускать программы в отдельных процессах, что чаще всего и требуется от программиста.
Рассмотрим пример (листинг 10.9), показывающий, как системные вызовы fork() и execve() работают вместе.
Листинг 10.9. Пример forkexec1.c
#include
#include
#include
extern char ** environ;

int main (void)


{
pid_t result;
char * sleep_args[] = {
"sleep",
"5",
NULL
};
result = fork ();
if (result == -1) {
fprintf (stderr, "fork error\n");
return 1;
}
if (result == 0) {
execve ("/bin/sleep", sleep_args, environ);
fprintf (stderr, "execve error\n");
return 1;
} else {
fprintf (stderr, "I'm parent with PID=%d\n",
getpid());
}
return 0;
}
Проверяем:
$ gcc -o forkexec1 forkexec1.c
$ ./forkexec1
I'm parent with PID=4185
$ ps
PID TTY TIME CMD
3239 pts/1 00:00:00 bash
4186 pts/1 00:00:00 sleep
4187 pts/1 00:00:00 ps
Итак, программа forkexec1 породила новый процесс и запустила в нем программу /bin/sleep, которая дает нам возможность в течение 15 с набрать команду ps и насладиться наличием в системе отдельного процесса.
Сообщение "I'm parent with PID=..." выводится в стандартный поток ошибок (stderr), хотя фактически не является ошибкой. Это искусственный прием, позволяющий выводить сообщение на экран немедленно, не задумываясь о возможных последствиях буферизации стандартного вывода.
Если внимательно разобраться в приведенной в листинге 10.9 программе, то станет очевидным, что конструкция else является избыточной, поскольку дочерний процесс может только безвозвратно запустить другую программу или завершиться ошибкой. Все инструкции, находящиеся далее вызова execve(), могут выполняться только родительским процессом.


Достарыңызбен бөлісу:
1   ...   7   8   9   10   11   12   13   14   15




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет