signal系统调用使用实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangqingchuan92/article/details/80907257

1.前言

1.1声明

文章中的文字可能存在语法错语以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

2.信号的基本概念

信号是进程之间互相通信的方法之一,它用来指出某种事件的发生。
信号可以由系统内核程序发出,也可以由某些进程发送,大部分是由内核程序发出。
信号是不可预知的,信号的发生是异步的。
当一个信号正在被处理,所有同样的信号都将被暂时搁置,直到这个信号被处理完成。
Linux处理信号主要有四种方式:
1.忽略该信号;
2.采用系统默认处置方式(一般为终止运行);
3.暂时搁置该信号;
4.由程序设计人员利用系统调用signal设定 处理信号函数。

常用信号

信号名称 描述
SIGABRT 调用abort产生此信号,进程异常终止。
SIGALRM 调用alarm设置计时器超时时,产生此信号。
SIGHLD 一个进程终止时发送该信号给其父进程。
SIGFPE 表示一个算数运算异常,例如除以0
SIGINT 用户按Ctrl+C键,产生该信号
SIGKILL 这是个不能被捕捉或忽略的信号,kill 9发送该信号
SIGPIPE 如果在写到管道时读进程已经终止,就产生该信号
SIGSEGV 该信号指示进程进行了 一次无效的内存引用
SIGTERM 由kill命令(1)发送的系统默认终止信号
SIGTSTP 用户按Ctrl+Z键产生该信号
SIGUSR1 用户定义信号,可用于应用程序
SIGUSR2 用户定义信号,可用于应用程序

更多关于信号的描述可以使用man 7 signal指令查看

3.使用实例

这个程序作用就是读入终端的输入字符,将小写的字母转变为大写的字母后输出到终端中。在此程序中,注册了针对信号SIGTERM的处理函数。当程序运行时,在另一个终端输入kill pid(进程号)指令时,该终端会向输入字符进程发送一个SIGTERM信号,输入字符程序接收到该信号后会转向信号处理函数,该函数自定义为结束输入字符进程。

#include<stdio.h>
#include<signal.h>

void sigcatcher(int signum);

int main()
{
    char buffer1[100],buffer2[100];

    int i;

    signal(SIGTERM,&sigcatcher);

    printf("PID of this Process:%d\n",getpid());

    printf("Please Input:\n");

    while(1)
    {
        fgets(buffer1,sizeof(buffer1),stdin);

        for(i = 0;i<100;i++)
        {

            if(buffer1[i]>=97&&buffer1[i]<=122)
            {

                buffer2[i] = buffer1[i] - 32;
            }
            else
            {
                buffer2[i] = buffer1[i];
            }
        }

        printf("Your Input:%s\n",buffer2);

    }
    exit(0);
}

void sigcatcher(int signum)
{
    printf("catch signal SIGTERM\n");

    exit(0);
}

使用gcc编译:gcc -o test test.c
这里写图片描述

编译后执行:./test
这里写图片描述

此时打开另一个终端,输入: kill 上一个终端获取的进程ID
这里写图片描述

观察上一个终端:
这里写图片描述

注意:在默认参数下,kill发送SIGTERM信号给进程,而kill -9表示强制杀死进程, 发送SIGKILL信号。和SIGTERM相比,该信号不能被忽略或者捕获,在进程接收到这个信号后不会进行任何清理操作。

以上。
参考资料:
https://blog.csdn.net/u010486679/article/details/78415666
https://blog.csdn.net/qq_25048473/article/details/53506361
刘学勇.Linux C编程从入门到精通[M].北京,电子工业出版社,2014.1.

猜你喜欢

转载自blog.csdn.net/wangqingchuan92/article/details/80907257
今日推荐