[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Тексты программ
waitid2.c
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <wait.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <signal.h>
7 #define MAXTRIES 8
8
9 main()
10 {
11 static siginfo_t stat;
12 pid_t child1;
13 int try = 0;
14
15 if ((child1 = fork()) == 0) {
16 execl("sleeper", "sleeper", (char *) 0);
17 exit(1);
18 }
19 printf("parent: waiting for child %ld\n", child1);
20 while (waitid(P_PID, child1, &stat,
21 WNOHANG|WEXITED) != -1) {
22 if (stat.si_pid == 0) {
23 if (try < MAXTRIES) {
24 try++;
25 sleep(1);
26 continue;
27 }
28 else {
29 printf("sending signal to child\n");
30 kill(child1, SIGKILL);
31 continue;
32 }
33 }
34 printf("tries = %d\n", try);
35 printf("child signal no: %d\n", stat.si_signo);
36 printf("child signal code: %d\n", stat.si_code);
37 if (stat.si_code == CLD_EXITED)
38 printf("exit status is: %d\n", stat.si_status);
39 else
40 printf("child signal is: %d\n", stat.si_status);
41 }
42 printf("parent: child completed\n");
43 }
waitpid.c
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <wait.h>
5 #include <stdio.h>
6 #include <signal.h>
7 #define MAXTRIES 7
8
9 main()
10 {
11 pid_t child1, pid;
12 int status, try = 0;
13
14 if ((child1 = fork()) == 0) {
15 execl("sleeper", "sleeper", (char *) 0);
16 exit(1);
17 }
18 printf("parent: waiting for child\n");
19 while ((pid = waitpid(child1, &status, WNOHANG))
20 != -1) {
21 if (pid == 0) {
22 if (try < MAXTRIES) {
23 try++;
24 sleep(1);
25 continue;
26 }
27 else {
28 printf("sending signal to child\n");
29 kill(child1, SIGKILL);
30 sleep(1);
31 continue;
32 }
33 }
34 if (WIFEXITED(status))
35 printf("child status %d\n",
36 WEXITSTATUS(status));
37 else
38 printf("child signal %d\n",
39 WTERMSIG(status));
40 printf("tries = %d\n", try);
41 }
42 printf("parent: all children terminated\n");
43 }