目录:
1.了解进程的相关概念
2.掌握fork/getpid/getppid函数使用
3.掌握ps/kill命令使用
4.掌握execl/execlp函数的使用
5.什么是孤儿进程、僵尸进程
6.掌握wait函数使用
7.掌握waitpid函数的使用
1、fork函数
作用:创建一个子进程
pid_t fork(void); 失败返回-1,成功返回:(1)父进程返回子进程的ID(非负);(2)子进程返回0。
pid_t类型表示进程ID,但为了表示-1,它是有符号整型。
注意返回值,不是fork函数返回两个值,而是fork后,fork函数变为两个,父子各返回一个值。
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("BEGIN...\n");
pid_t pid = fork();
if(pid < 0)
{
perror("fork err");
exit(1);
}
if(pid == 0)
{
//子进程
printf("I am a child, pid = %d, ppid = %d\n",getpid(),getppid());
while (1)
{
printf("I am a child!\n");
sleep(1);
}
}
else if(pid > 0)
{
//父进程的逻辑
printf("I am parent, childpid=%d, self=%d, ppid=%d\n",pid,getpid(),getppid());
sleep(1);
}
printf("END...\n");
return 0;
}
~$ gcc 02_fork.c
~$ ./a.out
BEGIN...
I am parent, childpid=22338, self=22337, ppid=13097
I am a child, pid = 22338, ppid = 22337
I am a child!
END...
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
2、查看进程信息ps、杀死进程kill
ps
- ps aux
- ps ajx --可以追溯进程之间的血缘关系
kill
- 给进程发送一个信号
- SIGKILL 9号信号
- kill -SIGKILL pid --杀死进程
~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
3、循环创建多个进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int n = 5;
int i = 0;
pid_t pid = 0;
for(i=0;i<n;i++)
{
pid = fork();
if(pid == 0)
{
//子进程
printf("I am child, pid=%d,ppid=%d\n",getpid(),getppid());
break; //子进程退出循环的接口
}
else if(pid > 0)
{
//父进程
//printf("I am father,pid=%d,ppid=%d\n",getpid(),getppid());
}
}
sleep(i);
if(i < 5)
{
printf("I am child, will exit, pid=%d,ppid=%d\n",getpid(),getppid());
}
else
{
//父进程
printf("I am father, will out, pid=%d,ppid=%d\n",getpid(),getppid());
}
return 0;
}
~$ gcc 03_nfork.c
~$ ./a.out
I am child, pid=24886,ppid=24885
I am child, pid=24887,ppid=24885
I am child, pid=24888,ppid=24885
I am child, pid=24890,ppid=24885
I am child, pid=24889,ppid=24885
I am child, will exit, pid=24886,ppid=24885
I am child, will exit, pid=24887,ppid=24885
I am child, will exit, pid=24888,ppid=24885
I am child, will exit, pid=24889,ppid=24885
I am child, will exit, pid=24890,ppid=24885
I am father, will out, pid=24885,ppid=22346