用户与内核的交互-内核向用户程序发起交互的方式

1 使用brk

brk是Linux中的一个系统调用,用于分配空间。在C语言中使用malloc时,内部一般使用的就是brk这个系统调用来分配。当然,我们也可以使用brk()函数来分配空间或释放空间。这个函数在<unistd.h>这个头文件中。

#include <stdio.h>
#include <unistd.h>
int main(){
    void* p = sbrk(0);//首先获取一个地址,但仅仅是地址而没有分配空间
    int* p1 = (int*)p;
    brk(p1+4);//分配了16个字节的空间
    p1[0] = 10;
    p1[1] = 20;
    p1[2] = 30;
    p1[3] = 40;
    printf("%d %d %d %d\n",p1[0],p1[1],p1[2],p1[3]);
    brk(p1);//释放刚才给p1分配的空间
    printf("%d %d %d %d\n",p1[0],p1[1],p1[2],p1[3]);
}

在这里插入图片描述

前面可以打印出来,后面出现段错误,就是因为brk将分配的空间释放了。

参考资料:

https://blog.csdn.net/larryliuqing/article/details/7247450、

https://blog.csdn.net/gfgdsg/article/details/42709943?spm=1000.2123.3001.4430

2 使用信号

2-1 概述

当我们在shell上写出一个死循环退不出来的时候,只需要一个组合键:ctrl+c,就可以解决了,这就是一个信号

在bash上执行命令kill -l便可看到系统定义的所有信号

在这里插入图片描述

每个信号都有一个编号和一个宏定义名称,这些宏定义都可以在signal.h中找到,在man手册中也可以找到各种信号的详细信息,使用命令:man 7 signal

在这里插入图片描述

2-2 产生信号的方式

  1. 通过键盘的组合键产生,比如ctrl+c产生SIGINT信号,ctrl+\产生SIGQUIT信号,ctrl+z产生SIGTSTP信号
  2. 硬件异常产生信号,这些条件由硬件检测并通知内核,然后内核向进程发送适当的信号。比如执行了除以零的指令、进程访问了非法内存地址等,cpu的运算单元就会产生异常,内核将这个异常解释成一个个信号发送给进程,然后进程会执行默认的信号处理操作(一般默认是杀死进程)。当然也可以忽略这个信号,或者写一个异常捕捉的函数来处理这个信号。
  3. 一个进程调用kill函数可以发送信号给另一个进程。
  4. 软件条件产生

第二种方式,就是内核与用户程序通过信号进行交互的一个体现了

参考资料:

https://blog.csdn.net/flowing_wind/article/details/79967588

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值