Листинг 10.17. Пример lsstatus.c
#include
#include
#include
#include
int main (int argc, char ** argv)
{
pid_t status, childpid;
int exit_status;
if (argc < 2) {
fprintf (stderr, "Too few arguments\n");
return 1;
}
status = fork ();
if (status == -1) {
fprintf (stderr, "Fork error\n");
return 1;
}
/* Child */
if (status == 0) {
execlp ("ls", "ls", argv[1], NULL);
fprintf (stderr, "Exec error\n");
return 1;
}
/* Parent */
childpid = wait (&exit_status);
if (WIFEXITED (exit_status)) {
printf ("Process with PID=%d "
"has exited with code=%d\n", childpid,
WEXITSTATUS (exit_status));
}
return 0;
}
Вот что получилось в результате выполнения этого примера:
$ gcc -o lsstatus lsstatus.c
$ ./lsstatus .
lsstatus lsstatus.c
Process with PID=10454 exited with code=0
$ ./lsstatus abrakadabra
ls: abrakadabra: No such file or directory
Process with PID=10456 exited with code=2
Забежим немного вперед и определим понятие сигнала. Сигнал — это системное сообщение, которое один процесс направляет другому. При этом процесс приемник может либо проигнорировать сигнал и продолжить свое выполнение, либо прервать все свои "дела" и немедленно начать обрабатывать (handle) полученный сигнал. Необходимо заметить, что существуют различные типы сигналов, некоторые из которых подразумевают немедленное завершение процесса.
Вы наверняка знаете, что при помощи команды kill можно "убить" процесс, над которым потерян контроль. На самом деле kill посылает процессу сигнал на завершение (если явно не указано другое). Вот как это делается:
$ yes > /dev/null &
[1] 10493
$ ps
PID TTY TIME CMD
9481 pts/1 00:00:00 bash
10493 pts/1 00:00:00 yes
10494 pts/1 00:00:00 ps
Достарыңызбен бөлісу: |