Linux:进程管理

fork()

使用fork()

  1. 将创建一个新的子进程

  2. 创建子进程时,父进程和子进程都将指向下一条指令

样例代码:

#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信号会发生什么事

  1. 从第13行开始看,signal接收到了信号参数,执行第二个参数stop函数,stop函数的功能是把flag改为0
  2. 程序本来卡在死循环中,因为flag为0终于跳出了死循环的条件,得以继续运行下去,执行第15行代码
  3. 打印 Hi,mia

总之这个signal语句有点超时空战士的感觉,明明在第13行却把卡在第14行的程序救出来了,有、、难理解

作业:

修改上一个作业的程序代码,在主进程中加入signal语句,使程序接收到ctrl+c信号时打印:We were on a break !!!!!!!!

posted @ 2022-09-13 21:34  Exungsh💫  阅读(19)  评论(0编辑  收藏  举报