#Linux系统编程(信号通信)

(一)发行版:Ubuntu16.04.7


(二)记录:

(1)信号通信

是进程通信的一张方式。

 (2)常用信号通信类型

参考博客:

Linux操作系统进程通信方式:信号(Signal)_/bin/kill 信号-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/abc123lzf/article/details/101245167#:~:text=%E4%BF%A1%E5%8F%B7%E6%98%AF%E4%B8%80%E6%9D%A1%E5%B0%8F%E7%9A%84%E6%B6%88%E6%81%AF%EF%BC%8C%E7%94%B1%E5%86%85%E6%A0%B8%E6%88%96%E8%80%85%E5%85%B6%E5%AE%83%E8%BF%9B%E7%A8%8B%E7%94%9F%E6%88%90%E5%B9%B6%E5%8F%91%E9%80%81%E8%87%B3%E7%9B%AE%E6%A0%87%E8%BF%9B%E7%A8%8B%EF%BC%8C%E7%9B%AE%E6%A0%87%E8%BF%9B%E7%A8%8B%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E8%AF%A5%E4%BF%A1%E5%8F%B7%E6%9D%A5%E5%81%9A%E5%87%BA%E5%93%8D%E5%BA%94%E3%80%82%20%E4%BF%A1%E5%8F%B7%E5%8F%AF%E4%BB%A5%E7%94%B1%E8%BF%9B%E7%A8%8B%E6%88%96%E8%80%85%E5%86%85%E6%A0%B8%E5%8F%91%E5%87%BA%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%9A%20%E7%94%A8%E6%88%B7%E5%9C%A8Bash%E7%95%8C%E9%9D%A2%E9%80%9A%E8%BF%87%E9%94%AE%E7%9B%98%E5%AF%B9%E6%AD%A3%E5%9C%A8%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E8%BE%93%E5%85%A5%20Ctrl%2BC,%E3%80%81%20Ctrl%2B%20%E7%AD%89%E4%BF%A1%E5%8F%B7%E5%91%BD%E4%BB%A4%EF%BC%8C%E6%88%96%E8%80%85%E6%89%A7%E8%A1%8C%20kill%20%E5%91%BD%E4%BB%A4%E5%8F%91%E9%80%81%E4%BF%A1%E5%8F%B7%E3%80%82

信号    信号值    程序默认行为    产生原因
SIGHUP    1    终止运行    终端线挂断
SIGINT    2    终止运行    来自键盘Ctrl + C的中断
SIGQUIT    3    终止运行    来自键盘Ctrl + \的退出
SIGILL    4    终止运行    进程尝试执行非法机器指令
SIGTRAP    5    终止运行并dump进程    跟踪陷阱
SIGABRT    6    终止运行并dump进程    来自abort()函数的终止信号
SIGBUS    7    终止运行    总线错误
SIGFPE    8    终止运行并dump进程    算术错误,例如尝试除以0
SIGKILL    9    终止运行    强制杀死进程,程序无法对该信号进行定制处理
SIGUSR1    10    终止运行    用户定义的信号1
SIGSEGV    11    终止运行并dump进程    段错误,程序访问了非法的地址,一般是由于程序本身BUG导致
SIGUSR2    12    终止运行    用户定义的信号2
SIGPIPE    13    终止运行    向一个没有读用户的管道做写入操作
SIGALRM    14    终止运行    来自alarm()函数的定时器信号
SIGTERM    15    终止运行    软件中止信号
SIGSTKFLT    16    终止运行    协处理器上的栈异常
SIGCHLD    17    忽略    一个子进程停止或者终止
SIGCONT    18    忽略    继续进程如果该进程停止
SIGSTOP    19    挂起当前进程直到SIGCONT    不是来自终端的停止信号
SIGTSTP    20    挂起当前进程直到SIGCONT    来自终端的停止信号
SIGTTIN    21    挂起当前进程直到SIGCONT    后台进程向终端读
SIGTTOU    22    挂起当前进程直到SIGCONT    后台进程向终端写
SIGURG    23    忽略    套接字上的紧急情况
SIGXCPU    24    终止运行    CPU时间限制超出
SIGXFSZ    25    终止运行    文件大小限制超出
SIGVTALRM    26    终止运行    虚拟定时器期满
SIGPROF    27    终止运行    剖析定时器期满
SIGWINCH    28    忽略    窗口大小变化
SIGIO    29    终止运行    在某个描述符上有可执行的IO操作
SIGIO    30    终止运行    电源故障

(3) Linux中的信号种类查询kill -l

(4) 信号发送函数kill、raise、alarm

kill:

头文件:#include<sys/types.h>

              #include<signal.h>

函数原型:int kill(pid_t pid,int sig);

raise:(自己给自己发信号)

头文件:#include<signal.h>

函数原型:int raise(int sig);

raise函数等价于kill(getpid(),sig);

alarm:(定时产生信号:SIGALRM)

头文件:#include<unistd.h>

函数原型:unsigned int alarm(unsigned int seconds);

(5)raise函数编译运行

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

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

printf("I will give a signal:\n");

raise(SIGKILL);   //终止运行

printf("signal is a.\n");

return 0;
}

 (6)kill函数编译运行

新建一个test进程每两秒打印“I am running.”编写一个kill进程来杀死test进程

test.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

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

while(1)
{
printf("I am runnig\n");
sleep(2);
}
return 0;
}

kill.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
pid_t pid;
int signal;

if(argc != 3)
{
printf("error.\n");
return -1;
}

pid=atoi(argv[1]);
signal=atoi(argv[2]);

kill(pid,signal);

return 0;
}

a.编译生成可执行文件

 

b.由于我们在运行kill时需要输入pid号和信号,我们不知道test进程的pid号,所以先运行test使用ps aux | grep ./test查询

(7)alarm函数编译运行

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
int i=0;
alarm(10);
while(1)
{
i++;
printf("%d\n",i);
sleep(1);
}
return 0;
}

 (8)防止进程结束的几种办法(比如等待接收信号)

while,sleep,pause

(9)信号的处理与signal函数

信号的处理方式:系统默认,忽略,捕获

signal函数:

头文件:<signal.h>

函数原型:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum,sighandler_t handler);

可简化为signal(参数1,参数2);

参数1:我们要进行处理的信号,系统的信号我们可以再终端键入kill -l查看。

参数2:处理的方式(系统默认,忽略,捕获)

a.系统默认

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
int i=0;
//signal(SIGINT,SIG_IGN);  //忽略
signal(SIGINT,SIG_DFL);  //系统默认
while(1)
{
i++;
printf("%d\n",i);
sleep(1);
}
return 0;
}

可以被ctrl+c打断(SIGINT    2    终止运行    来自键盘Ctrl + C的中断) 

b.忽略

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
int i=0;
signal(SIGINT,SIG_IGN);  //忽略
//signal(SIGINT,SIG_DFL);  //系统默认
while(1)
{
i++;
printf("%d\n",i);
sleep(1);
}
return 0;
}

ctrl+c无法打断进程,kill -2 3630也无法打断(2信号已经被忽略)

使用9信号即可kill进程。 

c.捕获

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

void WaitCC(int sig)
{
if(sig==SIGINT)
	printf("get signal.\n");
}

int main(int argc,char *argv[])
{
int i=0;
//signal(SIGINT,SIG_IGN);  //忽略
//signal(SIGINT,SIG_DFL);  //系统默认
signal(SIGINT,WaitCC);

while(1)
{
i++;
printf("%d\n",i);
sleep(1);
}
return 0;
}


(三)命令:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值