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 产生信号的方式
- 通过键盘的组合键产生,比如ctrl+c产生SIGINT信号,ctrl+\产生SIGQUIT信号,ctrl+z产生SIGTSTP信号
- 硬件异常产生信号,这些条件由硬件检测并通知内核,然后内核向进程发送适当的信号。比如执行了除以零的指令、进程访问了非法内存地址等,cpu的运算单元就会产生异常,内核将这个异常解释成一个个信号发送给进程,然后进程会执行默认的信号处理操作(一般默认是杀死进程)。当然也可以忽略这个信号,或者写一个异常捕捉的函数来处理这个信号。
- 一个进程调用kill函数可以发送信号给另一个进程。
- 软件条件产生
第二种方式,就是内核与用户程序通过信号进行交互的一个体现了
参考资料:
https://blog.csdn.net/flowing_wind/article/details/79967588