fork函数
- 返回值:fork仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值
- (1)在父进程中,fork返回新创建子进程的进程ID;
- (2)在子进程中,fork返回0;
- (3)如果出现错误,fork返回一个负值;
- 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。
- 在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
- fpid的值为什么在父子进程中不同。其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,因为子进程没有子进程,所以其fpid为0.
kill函数
- kill函数的原型为 int kill(pid_t pid, int sig);
- 在终端中发送信号用kill命令,格式为 kill 信号 目标进程PID,例如要杀掉1000号进程可以KILL -9 1000 或者 KILL -kill 1000
- SIGABRT,SIGALRM,SIGFPE,SIGPIPE,SIGINT,SIGHUP,SIGILL,SIGQUIT,SIGSEGV,SIGTERM,SIGUSR1,SIGUSR2这12种信号,如果在进程中没有对其进行捕获处理的话,进程在收到它们时,会终止,当然还有不可捕获的SIGKILL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <stdlib.h>
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER 10
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL 2
int
proc_number
=
0
;
/* 子进程的自编号,从0开始 */
void
do_something
(
)
;
int
main
(
int
argc
,
char
*
argv
[
]
)
{
int
child_proc_number
=
MAX_CHILD_NUMBER
;
/* 子进程个数 */
int
i
,
ch
;
pid_t
child_pid
;
pid_t
pid
[
10
]
=
{
0
}
;
/* 存放每个子进程的id */
if
(
argc
>
1
)
{
/* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */
child_proc_number
=
atoi
(
argv
[
1
]
)
;
child_proc_number
=
(
child_proc_number
>
10
)
?
10
:
child_proc_number
;
}
for
(
i
=
0
;
i
<
child_proc_number
;
i
++
)
{
if
(
(
proc_number
=
fork
(
)
)
==
0
)
{
proc_number
=
i
;
do_something
(
)
;
}
else
{
pid
[
i
]
=
proc_number
;
}
/* 在这里填写代码,建立child_proc_number个子进程
* 子进程要执行
* proc_number = i;
* do_something();
* 父进程把子进程的id保存到pid[i] */
}
/* 让用户选择杀死哪个进程。输入数字(自编号)表示杀死该进程
* 输入q退出 */
while
(
(
ch
=
getchar
(
)
)
!=
'q'
)
{
if
(
isdigit
(
ch
)
)
{
kill
(
pid
[
ch
-
'0'
]
,
SIGTERM
)
;
/* 在这里填写代码,向pid[ch-'0']发信号SIGTERM,
* 杀死该子进程 */
}
}
/* 在这里填写代码,杀死本组的所有进程 */
kill
(
0
,
SIGTERM
)
;
return
0
;
}
void
do_something
(
)
{
for
(
;
;
)
{
printf
(
"This is process No.%d and its pid is %d\n"
,
proc_number
,
getpid
(
)
)
;
sleep
(
2
)
;
/* 主动阻塞两秒钟 */
}
}
|