1简介
信号:软中断信号,是软件层次上对中断的一种模拟,用于提醒进程事件的发生。
用户比较容易控制的信号发送方式有:
- 组合按键方式;
- Shell命令方式;
- 系统调用:kill、raise、abort等。
本部分主要以系统调用为主。
2 系统调用
2.1 kill函数
#include <signal.h>
int kill(pid_t pid, int sig);
函数功能:
- 给指定进程,是否杀死进程取决于所发送信号的默认动作。
参数说明:
- pid:接收信号的进程id
– pid > 0:发送信号sig给进程pid;
– pid = 0:发送信号sig给当前进程所属组中的所有进程;
– pid = -1:发送信号sig给除1号进程与当前进程外的所有进程;
– pid < -1:发送信号sig给属于进程组pid的所有进程。 - sig:发送的信号编号
返回值:
- 0: 表示kill函数调用成功,当前进程有权限;
- -1且errno为ESRCH:表示指定接收信号的进程不存在;
- -1且errno不为ESRCH:当前进程没权限。
【案例 1】创建一个子进程,在子进程中用kill发送信号,杀死父进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int main() {pid_t tempPid;tempPid = fork();if(tempPid == 0){//childsleep(1);printf("Child pid = %d, ppid = %d\n", getpid(), getppid());kill(getppid(), SIGKILL);} else if(tempPid > 0) { //parentwhile(1){printf("parent pid = %d, ppid = %d\n", getpid(), getppid());}//of while}//of ifreturn 0;
}//of main
2.2 其它函数
#include <signal.h>
int raise(int sig);
函数功能:
- 给当前进程发送指定信号。
- raise(sig) == kill(getpid(), sig)
参数说明:
- sig:发送的信号编号
#include <stdlib.h>
void abort(void);
函数功能:
- 给当前进程发送异常终止信号SIGABRT,终止当前进程并生成core文件。
- 该函数在调用之前会先解除阻塞信号SIGABRT,然后发送信号给自己。
该函数无参数无返回值:视为百分百调用成功。
#include <unistd.h>
int pause(void);
函数功能:
- 造成进程主动挂起,等待信号唤醒。
- 调用该函数后进程将主动放弃CPU,进入阻塞状态,直到有信号将其唤醒,才继续工作。
该函数无参数。
返回值:
- 若信号的默认处理动作是终止进程,则进程终止,pause函数没有机会返回;
- 若信号的默认处理动作是忽略,进程继续处于挂起状态,pause函数不返回;
- 若信号的默认处理动作是捕获,则调用完信号处理函数后,pause函数返回-1,并将errno设置为EINTR,表示“被信号中断”。