C 语言进程通信之信号API
1. kill
#include <sys/types.h>
#include <signal.h>int kill(pid_t pid, int sig);
- pid是接收信号的进程PID,称为目标进程。
- sig是信号的编号。
示例1
#include <signal.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{// atoi 将字符串转化为int argv[1]运行时需传参int id = atoi(argv[1]);// kill(id,9);kill(id,SIGKILL);return 0;
}
2. signal
#include <signal.h>sighandler_t signal(int signum, sighandler_t handler)
- signum 信号
- handler
signal(sig, SIG_IGN); 忽略接收的信号
signal(sig, SIG_DFL); 执行缺省动作
void (*func)(int) 捕获信号执行func函数
#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int arg)
{printf("收到信号:%d\n",arg);
}int main(int argc, char const *argv[])
{printf("[%d]process\n",getpid());// 忽略信号// signal(SIGUSR1,SIG_IGN);// signal(SIGUSR2,SIG_IGN);// 默认动作(和不写作用一样)// signal(SIGUSR1,SIG_DFL);// signal(SIGUSR2,SIG_DFL);// 自定义信号动作signal(SIGUSR1,handler);signal(SIGUSR2,handler);signal(SIGKILL,handler);signal(SIGSTOP,handler);signal(SIGINT,handler);while (1);return 0;
}
运行:
kill -SIGUSR1 XXXX
注意:
SIGKILL, SIGSTOP不能被捕捉和忽略,只能执行缺省动作
3. raise
#include <signal.h>
int raise(int sig);
自己给自己发送信号
参数:
sig: 发送的信号。
返回值:
成功:0
失败:非0
#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int arg)
{static int time = 0;printf("我在打游戏\n");sleep(1);time++;if (time%10 == 0){printf("放下游戏出来搞学习\n");}
}int main(int argc, char const *argv[])
{signal(SIGUSR1, handler);while (1){raise(SIGUSR1);}return 0;
}
4. pause
#include <unistd.h>
int pause(void);
挂起当前进程,可以充当while(1);