文章目录
- 2.19 信号概述
- 信号的概念
- Linux信号一览表
- 信号的5种默认处理动作
- core
- core文件权限及位置设置
- 2.20 kill、raise、abort函数(给进程发信号)
2.19 信号概述
信号的概念
Linux信号一览表
共62种信号。
SIGKILL:所有进程不包括僵尸进程
SIGSTOP:暂停。不是结束
信号的5种默认处理动作
core
#include <stdio.h>
#include <string.h>
int main() {
char * buf;//指针没有指向一个具体的合法内存
strcpy(buf, "hello");//产生错误
return 0;
}
- 先修改core文件的最大容量,否则如果是0的话,进程就算收到信息也不会产生core文件(ulimit -c xxx)
- 生成可调试的可执行文件 gcc xx.c -g
- 运行 ./a.out 此时就会生成包含错误信息的core文件
- gdb a.out 进入调试模式 输入:core-file core
SIGSEGV:访问非法内存导致的错误
core文件权限及位置设置
-
core文件大小为0表示不会产生core文件,通过ulimit -c 1024将core文件大小修改成1024即会产生core文件。
-
并使用sudo bash -c "echo core > /proc/sys/kernel/core_pattern"指令来进行写入,指定程序所在目录为core文件生成目录。
2.20 kill、raise、abort函数(给进程发信号)
子进程先执行还是父进程先执行不确定,他们抢占系统资源。
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if(pid == 0) {
// 子进程
int i = 0;
for(i = 0; i < 5; i++) {
printf("child process\n");
sleep(1);
}
} else if(pid > 0) {
// 父进程
printf("parent process\n");
sleep(2);
printf("kill child process now\n");
kill(pid, SIGINT);//终止进程,pid为子进程的进程号
}
return 0;
}
执行结果如下: