kill、raise、abort函数:
/*
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
-功能:给任何的进程或者进程组pid,发送某个信号任何的信号 sig
-参数:
-pid:需要发送给的进程的id
>0 : 将信号发送给指定的进程
=0 : 将信号发送给当前的进程组
=-1 : 将信号发送给每一个有权限接收这个信号的进程
<-1 : 这个pid=某个进程组的id取反(-12345表示给12345进程组发送信号)
-sig:需要发送的信号的编号或者宏值(建议使用宏值因为不同的架构编号可能不同),0表示不发送任何信号
kill(getppid(),9);
kill(getpid(),9);
#include <signal.h>
int raise(int sig);
-功能:给当前的进程发送信号
-参数
-sig:要发送的信号
-返回值:
成功 0
失败 非0
kill(getpid(),sig);
#include <signal.h>
void abort(void);
功能:发送SIGABRT信号给当前进程,杀死当前进程
kill(getpid(),SIGABRT);
*/
#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);
}
return 0;
}
alarm函数:
/*
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:设置定时器(闹钟)。函数调用开始倒计时,当倒计时为0的时候
函数会给当前的进程发送一个信号:SIGALARM
参数:
seconds:倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发送信号)
取消一个定时器,通过alarm(0)
返回值:
之前没有定时器返回0
之前有定时器,返回之前定时剩余的倒计时剩余的时间
SIGALARM:默认终止当前的进程,每一个进程都有且只有唯一的一个定时器
alarm(10); ->返回0
过了1s
alarm(5);//覆盖了之前的 ->返回9
alarm(100) -> 该函数是不阻塞的
*/
/*
实际的时间 = 内核时间 + 用户时间 + 消耗的时间(指用户态到内核态切换的时间)
进行文件io操作的时候比较浪费时间
定时器,与进程的状态无关(自然定时法)。无论进程处于什么状态,alarm都会计时
*/
#include <stdio.h>
#include <unistd.h>
int main(){
int seconds=alarm(5);
printf("seconds = %d\n",seconds);//返回0
sleep(2);
seconds=alarm(2);//不阻塞
printf("seconds = %d\n",seconds);//3
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:定时器以什么时间计时
ITIMER_REAL:真实时间,时间到达,发送SIGALRM 常用
ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计时,时间到达,发送SIGPROF
new_value:设置定时器的属性
struct itimerval {//定时器的结构体
struct timeval it_interval; //每个阶段的时间,间隔时间
struct timeval it_value; //延迟多长时间执行定时器
};
struct timeval {//时间的结构体
time_t tv_sec; //秒数
suseconds_t tv_usec; //微秒
};
过10s后每隔2s定时一次
old_value:记录上一次的定时的时间参数可以在这里获取到,用不到的话传递一个NULL
返回值:
成功 0
失败 -1 指定错误号
*/
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
//过3s后每隔2s定时一次
int main(){
struct itimerval new_value;
//设置值
new_value.it_interval.tv_sec=2;//设置间隔的时间
new_value.it_interval.tv_usec=0;
//设置延迟的时间,3s后开始第一次定时
new_value.it_value.tv_sec=3;//s
new_value.it_value.tv_usec=0;//us
int ret=setitimer(ITIMER_REAL,&new_value,NULL); //非阻塞的
printf("定时器开始了...\n");
if(ret==-1){
perror("setitimer");
exit(0);
}
getchar();
return 0;
}