Linux:进程管理
fork()
使用fork()
-
将创建一个新的子进程
-
创建子进程时,父进程和子进程都将指向下一条指令
样例代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
fork();//这有点像细胞分裂,运行到这一句话的时候程序裂成两个,都继续往下执行,可以理解成接下来有两个程序执行下面的代码,一个是主进程一个是子进程。
fork();//所以上面那俩进程一起运行到了这一句,各自又分裂了,所以变成了2*2=4个程序执行接下来的代码
fork();//又来了又来了这四位又裂开了变成了4*2=8个程序执行接下来的代码
printf("Using fork() system call\n");//好了现在有八个哥们执行这一句,所以会打印八次
return 0;
}
书接上回,fork()将创造一个新的进程,那么怎么区分主进程和子进程呢,fork()会返回一个数值,用于区分主进程和子进程,如果返回值是0说明是子进程,如果是一个非0的数说明是主进程。
所以如果我们运行下面这句代码
int pid = fork()
会发生什么呢
首先fork函数被调用了,程序裂成两个;
这两个程序都将fork的返回值赋值给pid
所以一个程序的pid是0,一个程序的pid是一个非负数(这句话很重要)
接着这两个程序都将向下运行,可以通过一个if语句对pid的值进行判断,这样我们就可以让主进程和子进程做不一样的事情
作业:
让主进程打印:这是主进程
让子进程打印:这是子进程
exec()
语法有、小麻烦,应付这个作业我觉得用就ok了
char *args[]={"./helloworld",NULL};
execvp(args[0],args);
printf("jump!!\n")
当程序运行到第二行时将跳转到程序helloworld中
一般配合fork()一起使用,子进程中使用exec()调用程序,主进程做点别的
问:上面代码中jump!!会不会被打印出来
作业:
1、写一个叫print的打印程序打印出helloword
2、修改昨晚程序的代码,当运行到子进程时调用print程序
signal()
signal这个函数有两个参数,直接上例子
signal(SIGINT, function); //注册SIGINT信号发生后的行为
- 第一个参数是信号参数,目前貌似默认是SIGINT,当我们在程序运行时按下ctrl+c就会向程序发送这个信号
- 第二个参数是当接收到第一个信号后,程序要做些什么,一般是个函数
我个人感觉,signal语句在程序运行时会直接被跳过,只有当接收到信号参数时,才会被激活执行第二个参数的功能(有点费解)
用代码来解释或许更加直观:
int flag;
void waiting()
{
while (flag == 1);//当flag为1时,进入死循环
}
void stop()
{
flag = 0;
}
int main()
{
flag = 1;
signal(SIGINT, stop); //一开始还没收到ctrl+c的信号,所以这句话被直接跳过了
waiting();//此时flag为1,看第4行
printf("Hi,mia\n");
}
所以当ctrl+c信号还没发出时,程序会一直卡在第14行函数的死循环中出不来
我们来看看如果发出ctrl+c信号会发生什么事
- 从第13行开始看,signal接收到了信号参数,执行第二个参数stop函数,stop函数的功能是把flag改为0
- 程序本来卡在死循环中,因为flag为0终于跳出了死循环的条件,得以继续运行下去,执行第15行代码
- 打印 Hi,mia
总之这个signal语句有点超时空战士的感觉,明明在第13行却把卡在第14行的程序救出来了,有、、难理解
作业:
修改上一个作业的程序代码,在主进程中加入signal语句,使程序接收到ctrl+c信号时打印:We were on a break !!!!!!!!