Управление процессами и нитями в ОС QNX. Основные принципы управления процессами и нитями в ОС QNX, страница 2

UID        PID       PPID  C STIME TTY          TIME CMD

0     335894          2  - Nov23 ?        00:00:00 login

0     561175     479263  - Nov23 ?        00:00:27 pterm

0     434203          1  - Nov23 ?        00:00:09 pwm

0     561180     561175  - Nov23 ?        00:00:00 /bin/sh

0     479263          1  - Nov23 ?        00:00:35 shelf

0     479263          1  - Nov23 ?        00:00:35 shelf

0     516128          1  - Nov23 ?        00:00:01 bkgdmgr

0     516129          1  - Nov23 ?        00:00:02 wmswitch

0     516130          1  - Nov23 ?        00:00:12 saver

0     561187     561180  - Nov23 ?        00:00:07 pfm

0    3493924     561187  - Nov23 ?        00:00:01 ped proc_log.txt

0    3498021     561180  - 05:27 ?        00:00:00 ./father

0    3117094     479263  - Nov23 ?        00:00:03 helpviewer

0    3117095    3117094  - Nov23 ?        00:00:02 vserver.file

0    3502120    3498021  - 05:27 ?        00:00:00 son

0    3506217    3502122  - 05:27 ?        00:00:00 ps -f

0    3502122    3498021  - 05:27 ?        00:00:00 sh -c sh

[2] + Done (40)            ./father

2.2.  Взаимодействие родственных процессов

1).  Родительский процесс запускает процесс-потомок и ожидает его завершение.

father1.c

#include <sys/types.h>

#include <stdlib.h>

#include <process.h>

main()

{    

int status;

printf("\nfather:  PID=%i\tPPID=%i\n", getpid(), getppid());

if(fork()==0) execl("./son1","son1", NULL);

wait(&status);

system("ps -f | tee -a fs_log.txt");

}

son1.c

#include <process.h>

#include <stdlib.h>

#include <sys/types.h>

main()

{

printf("\nson:  PID=%i\tPPID=%i\n",getpid(), getppid());

system("ps -f | tee -a fs_log.txt");

exit(0);}

2).  Родительский процесс запускает процесс-потомок и, не ожидая его завершения, завершает свое выполнение.

father2.c

#include <sys/types.h>

#include <stdlib.h>

#include <process.h>

main()

{    

int status;

printf("\nfather:  PID=%i\tPPID=%i\n", getpid(), getppid());

if(fork()==0) execl("./son2","son2", NULL);

system("ps -f | tee -a fs_log.txt");

}

son2.c

#include <process.h>

#include <stdlib.h>

#include <sys/types.h>

main()

{

printf("\nson:  PID=%i\tPPID=%i\n",getpid(), getppid());

sleep(5);

system("ps -f | tee -a fs_log.txt");

exit(0);

}

3).  Родительский процесс запускает процесс-потомок и не ожидает его завершения;

процесс-потомок завершает свое выполнение.

father3.c

#include <sys/types.h>

#include <stdlib.h>

#include <process.h>

main()

{    

int status;

printf("\nfather:  PID=%i\tPPID=%i\n", getpid(), getppid());

if(fork()==0) execl("./son3","son3", NULL);

sleep(10);

system("pidin | grep Zombie | tee -a fs_log.txt");

}

son3.c

#include <process.h>

#include <stdlib.h>

#include <sys/types.h>

main()

{

printf("\nson:  PID=%i\tPPID=%i\n",getpid(), getppid());

system("ps -f | tee -a fs_log.txt");

exit(0);}

auto.c

#include <sys/types.h>

#include <stdlib.h>

#include <process.h>

main()

{    

int status;

if(fork()==0) execl("./father1","father1", NULL);

wait(&status);

if(fork()==0) execl("./father2","father2", NULL);

wait(&status);

if(fork()==0) execl("./father3","father3", NULL);

wait(&status);

}

Пример выполнения программы:

# make father1

cc     father1.c   -o father1

# make son1

cc     son1.c   -o son1

# make father2

cc     father2.c   -o father2

# make son2

cc     son2.c   -o son2

# make father3

cc     father3.c   -o father3

# make son3

cc     son3.c   -o son3

# make auto