💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
[TOC] # 信号产生函数 ## kill函数 ~~~ #include <sys/types.h> #include <signal.h> ​ int kill(pid_t pid, int sig); 功能:给指定进程发送指定信号(不一定杀死) ​ 参数: pid : 取值有 4 种情况 : pid > 0: 将信号传送给进程 ID 为pid的进程。 pid = 0 : 将信号传送给当前进程所在进程组中的所有进程。 pid = -1 : 将信号传送给系统内所有的进程。 pid < -1 : 将信号传给指定进程组的所有进程。这个进程组号等于 pid 的绝对值。 sig : 信号的编号,这里可以填数字编号,也可以填信号的宏定义,可以通过命令 kill - l("l" 为字母)进行相应查看。不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致。 ​ 返回值: 成功:0 失败:-1 ~~~ super用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root用户的pid) 是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。 只能向自己创建的进程发送信号。 普通用户基本规则是:发送者实际或有效用户ID == 接收者实际或有效用户ID ~~~ int main() { pid_t pid = fork(); if (pid == 0) {//子进程 int i = 0; for (i = 0; i<5; i++) { printf("in son process\n"); sleep(1); } } else {//父进程 printf("in father process\n"); sleep(2); printf("kill sub process now \n"); kill(pid, SIGINT); } ​ return 0; } ~~~ ## raise函数 ~~~ #include <signal.h> ​ int raise(int sig); 功能:给当前进程发送指定信号(自己给自己发),等价于 kill(getpid(), sig) 参数: sig:信号编号 返回值: 成功:0 失败:非0值 ~~~ ## abort函数 ~~~ #include <stdlib.h> ​ void abort(void); 功能:给自己发送异常终止信号 6) SIGABRT,并产生core文件,等价于kill(getpid(), SIGABRT); ​ 参数:无 返回值:无 ~~~ ## alarm函数(闹钟) ~~~ ​#include <unistd.h> ​ unsigned int alarm(unsigned int seconds); 功能: 设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。每个进程都有且只有唯一的一个定时器。 取消定时器alarm(0),返回旧闹钟余下秒数。 参数: seconds:指定的时间,以秒为单位 返回值: 返回0或剩余的秒数 ~~~ 定时,与进程状态无关(自然定时法)!就绪、运行、挂起(阻塞、暂停)、终止、僵尸……无论进程处于何种状态,alarm都计时。 ~~~ int main() { int seconds = 0; ​ seconds = alarm(5); printf("seconds = %d\n", seconds); ​ sleep(2); seconds = alarm(5); printf("seconds = %d\n", seconds); ​ while (1); return 0; } ~~~ ## setitimer函数(定时器) ~~~ #include <sys/time.h> ​ int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 功能: 设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。 参数: which:指定定时方式 a) 自然定时:ITIMER_REAL → 14)SIGALRM计算自然时间 b) 虚拟空间计时(用户空间):ITIMER_VIRTUAL → 26)SIGVTALRM 只计算进程占用cpu的时间 c) 运行时计时(用户 + 内核):ITIMER_PROF → 27)SIGPROF计算占用cpu及执行系统调用的时间 new_value:struct itimerval, 负责设定timeout时间 struct itimerval { struct timerval it_interval; // 闹钟触发周期 struct timerval it_value; // 闹钟触发时间 }; struct timeval { long tv_sec; // 秒 long tv_usec; // 微秒 } itimerval.it_value: 设定第一次执行function所延迟的秒数 itimerval.it_interval: 设定以后每几秒执行function ​ old_value: 存放旧的timeout值,一般指定为NULL 返回值: 成功:0 失败:-1 ~~~ ~~~ void myfunc(int sig) { printf("hello\n"); } ​ int main() { struct itimerval new_value; ​ //定时周期 new_value.it_interval.tv_sec = 1; new_value.it_interval.tv_usec = 0; ​ //第一次触发的时间 new_value.it_value.tv_sec = 2; new_value.it_value.tv_usec = 0; ​ signal(SIGALRM, myfunc); //信号处理 setitimer(ITIMER_REAL, &new_value, NULL); //定时器设置 ​ while (1); ​ return 0; } ~~~