Linux进程管理—信号、定时器

信号:

1. 信号的作用:

背景:

进程之间通信比较麻烦。

但进程之间又必须通信,比如父子进程之间。

作用:

通知其他进程响应。进程之间的一种通信机制。

信号:

接受信号的进程马上停止,调用信号处理函数。

信号处理函数:

默认处理函数

打印信号信息,退出进程。

用户处理函数。

中断:接受信号的进程马上停止,有信号发生时,处理信号,进程中断,信号处理结束,返回进程继续执行。

软中断

案例:

1.进程之中,默认信号处理

2.进程之中,用户信号处理

3.中断

命令:

kill –s 信号 进程ID

信号:数字1-3134-64

宏SIGINT=2

ctrl+d 发送信号2 SIGINT(中断信号)

kill -l察看所有信号

信号SIGKILLSIGSTOP不能被处理.(只能调用默认处理函数)

信号的注册,信号与函数绑定(用户处理函数)

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

voidhandle()

{

printf(“信号发生!\n”);

}

voidmain()

{

signal(SIGINGT , handle);

while(1)

{

printf(“进程执行中\n”);

sleep(1);

}

}

向该进程发送SIGINT(中断信号),进程调用函数handle

说明:

如果信号没有绑定函数,向进程发送了信号,则进程调用默认处理函数:打印信号信息,进程退出。

如果信号绑定了函数,向进程发送相应的信号,则进程调用用户处理函数。

使用程序发生信号:

发送信号

int kill(pid_t pid,int s);

第一个参数:pid:进程ID,向该进程发送信号。

第二个参数:s:信号,发送的信号

进程ID的要求:

>0:发送信号到指定进程

=0:发送信号到该进程所在进程组的所有进程

-1:发送给所有进程,除init外

<0:发送给指定的进程组(组ID=绝对值)

例子:

Signal.c

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

voidhandle()

{

printf(“信号发生!\n”);

}

voidmain()

{

signal(SIGINGT , handle);

while(1)

{

printf(“进程执行中%d\n,getpid()”);

sleep(1);

}

}

Kill.c

#include<stdio.h>

#include<signal.h>

void main()

{

while(1)

{

kill(3828,SIGINT);

sleep(2);

}

}

信号的应用:

1. 延时器timeout

延长器信号:SIGALRM

信号发出函数:alarm

#include<unistd.h>

unsigned int alarm(unsigned int seconds);

在指定的时间发送信号 ,指向本进程发送该信号,只发送一次。

例子:

#include<stdio.h>

#include<signal.h>

voiddeal()

{

printf(“起床了!”);

}

void main()

{

signal(SIGALRM , deal);

alarm(5); //5秒钟后,发送信号

while(1)

{

//进程处理

}

}

2. 定时器

int setitimer(int which,//计时方式

//ITIMER_REAL真实事件(时钟时间)/ ITIMER_VIRTUAL 进程时间(进程运行时间) /ITIMER_PROF混合时间

const struct itimerval *val,//定时器的时间参数

struct itimerval *oldval);//返回原来设置的定时器

//如果=NULL,则不返回

struct itimerval

{

struct timevalit_interval;//间隔时间

structtimeval it_value;//延时时间

}

structtimeval

{

long tv_sec; //秒

long tv_usec;//微秒

}

例子:

#include<stdio.h>

#include<signal.h>

#include<sys/time.h>

voiddeal()

{

printf(“起床了!\n”);

}

voidmain()

{

itimerval val;

Signal(SIGALRM,deal);

//描述定时器

val.it_interval.tv_sec=3; //间隔时间设置为3秒,则程序启动后,3秒钟会触发时器,发送信号SIGALRM

val.it_value.tv_sec=1; //触发定时器后,每1秒钟触发一次定时器

setitimer(ITIMER_REAL,&val,0); //设置定时器

//如果想程序一启动就触发定时器

//val.it_interval.tv_sec=0;

//val.it_interval.tv_usec=1; 毫秒设置为1秒,不能把秒和毫秒都设置为0,会使程序无法触发定时器的

while(1)

{

printf(“进程执行中!\n”);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值