提示:以下是本篇文章正文内容,下面案例可供参考
一、信号的概念
信号 是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。 与信号有关的系统调用在“signal.h”头文件中有声明 常见信号的值,及对应的功能说明: 信号的值在系统源码中的定义如下:
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
二、修改信号的方式 —— signal()
typedef void ( *sighandle_t )( int );
sighandle_t ( *signal )( int sig, sighandle_t sig_fun );
忽略: SIG_IGN
默认: SIG_DFL
自定义:自己写的信号处理函数
举个例子:在键盘上按下 Ctrl+c 时,会给当前终端前台执行的进程发送 SIGINT 信号,用 signal 修改 SIGINT 信号的响应方式
示例代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include <signal.h>
void fun(int sign)
{
printf("fun was called, sign = %d\n", sign);
}
int main()
{
signal(SIGINT, fun);
while(1)
{
sleep(1);
printf("main running\n");
}
exit(0);
}
注意:上面这个程序在运行时 CTRL+c 是无法将该进程结束掉的 解决方法: 1.使用 CTRL+z 将该进程暂停 2.使用 jobs -p 找到该进程的pid 3.使用 kill -9 pid 结束该进程
三、发送信号 – kill()
kill() 可以向指定的进程发送指定的信号: int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程 pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程 pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。 sig 指定发送信号的类型。
使用 kill()系统调用实现类似于系统 kill 命令的程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
int main(int argc, char* argv[])
{
if ( argc != 3 )
{
printf("argc error\n");
exit(0);
}
int pid = 0;
int sig = 0;
sscanf(argv[1],"%d",&pid);
sscanf(argv[2],"%d",&sig);
if ( kill(pid,sig) == -1 )
{
perror("kill error");
}
exit(0);
}
|