linux进程间通信signal,Linux 进程间通信 信号(signal)

1. 概念:

1)信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式

2)信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

3)如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被 取消时才被传递给进程。

2.用户进程对信号的响应方式:

1)忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

2)捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

3)执行缺省操作:Linux对每种信号都规定了默认操作

3.信号:

SIGINT:ctrl+c 终止信号

SIGQUIT:ctrl+\ 终止信号

SIGTSTP:ctrl+z 暂停信号

SIGALRM:闹钟信号 收到此信号后定时结束,结束进程

SIGCHLD:子进程状态改变,父进程收到信号

SIGKILL:杀死信号

4.相关函数:

1)int kill(pid_t pid, int sig);

功能:信号发送

参数:pid:指定进程

sig:要发送的信号

返回值:成功 0;失败 -1

2)int raise(int sig);

功能:进程向自己发送信号

参数:sig:信号

返回值:成功 0;失败 -1

3)unsigned int alarm(unsigned int seconds)

功能:在进程中设置一个定时器

参数:seconds:定时时间,单位为秒

返回值:如果调用此alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。

注意:一个进程只能有一个闹钟时间。如果在调用alarm时已设置过闹钟时间,则之前的闹钟时间被新值所代替

4)int pause(void);

功能:用于将调用进程挂起直到收到信号为止。

5)void (*signal(int signum, void (*handler)(int)))(int);

或者:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

功能:信号处理函数

参数:signum:要处理的信号//不能是SIGKILL和SIGSTOP

handler:SIG_IGN:忽略该信号。

SIG_DFL:采用系统默认方式处理信号。

自定义的信号处理函数指针

返回值:成功:设置之前的信号处理方式;失败:SIG_ERR

6)void abort(void);

给自己发送异常终止信号,(6.SIGABRO)终止并产生core文件。

例子:kill 函数发送杀死pid指向的进程的信号,raise 发送杀死自己的信号

#include #include#include#include#include

int main(int argc, const char *argv[])

{

pid_t pid;

pid=fork();if(pid < 0)

{

perror("fork fail");

exit(1);

}else if(pid == 0)

{

printf("child \n");

}else{kill(pid,SIGKILL);//(此处pid是子进程的进程号)杀死 pid 发送进程的信号,kill 给其他进程发送信号,指定进程号

printf("child killed\n");sleep(1);

printf("father \n");wait(NULL); //等待子进程结束,并回收子进程资源

raise(SIGKILL);//杀死自己的信号,函数raise 给自己发送信号

}

return0;

}

测试:子进程还未来得及运行就被杀死了

d64784ed62cd63575e7b4114fae9bd5e.png

例子2: 定时器的使用

#include #include#include

int main(int argc, const char *argv[])

{

printf("%d\n",alarm(7)); //7 秒定时器,此时返回 0 ,前面没有使用定时器sleep(2); //睡 2 秒while(1)

{

printf("%d\n",alarm(3)); //重新设置定时器值为 3 ,返回上次定时器剩余的时间,7-2 = 5sleep(7); //睡7秒,后会结束进程

}

return0;

}

测试:Alarm clock 是定时器结束时提醒

7aafbe443c2b3e4ce6cb6be003bc418b.gif

signal 信号使用例子1 :

#include #include#includevoid handler(intarg)

{

printf("\nctrl + c\n");//exit(1);//raise(SIGKILL);

kill(getpid(),9); //9表示 SIGKILL 杀死信号

}

int main(int argc, const char *argv[])

{signal(SIGINT,handler);//定义自己的处理信号,当SIGINT信号发生时,调用 handler 函数处理

while(1);

return0;

}

测试:

f54fa48c418cea986b0efaa99ab6a16d.png

signal 信号使用例子2 :

#include #include#include

int main(int argc, const char *argv[])

{

signal(SIGINT,SIG_IGN);//ctrl +c 信号被忽略,SIG_IGN 表示忽略该信号

while(1);

return0;

}

测试: 通过 ctrl + c 信号不能终止这个进程

70473d21adc407e53cfe14a86246c862.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值