Linux操作系统之进程通信的信号机制

转载自他人的Linux笔记
https://blog.csdn.net/weixin_43401028/category_10066240.html

进程通信的信号机制

1.信号的基本概念
信号是进程在运行过程中,由自身产生或由进程外部发来的消息(事件)。信号是硬件中断的软件模拟(软中断)。每个信号用整型常量宏表示,以SIG开头,它们在系统头文件中定义,可以在shell提示符下输入“kill -l”查看信号列表,或者输入“man signal”查看更详细的说明。
2.涉及的系统调用
信号机制需要两个系统调用:信号注册函数signal()和发送信号函数kill()。

signal函数

signal函数是一个当接受到指定信号后,转到指定的函数执行

头文件:
#include
系统调用格式:
signal(sig,handler )
参数定义:
int sig;
void(*handler) (int)

简单例子:

void alarming();//声明alarming函数
signal(SIGALRM,alarming);//当执行到这句话的时候,告诉执行该语句的进程,如果其他进程向此进程发送了SIGALRM信号时,就去执行alarming函数;

且有:

  1. SIG_IGN:表示当进程运行中接收到指定信号时,忽略它,不做任何处理。
  2. SIG_DFL:表示交由系统缺省处理,使用系统自带的处理程序完成信号的处理。

返回值:如果调用成功,返回以前该信号的处理函数的地址,否则返回SIG_ERR。

kill函数

kill()函数是一个用于向指定进程或进程组发送信号的函数
#include 
 
#include 
 
int kill(pid_t pid, int sig);

即:

  1. 头文件:

    #include
    #include

  2. 系统调用格式:

    Int kill(pid,sig )s

  3. 参数定义:

    int pid,sig;

    参数
    pid:可能选择有以下四种

    1. pid大于零时,pid是信号欲送往的进程的标识。
    2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
    3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
    4. pid小于-1时,信号将送往以-pid为组标识的进程。

    sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。

    返回值说明: 成功执行时,返回0。失败返回-1,errno被设为以下的某个值 EINVAL:指定的信号码无效(参数 sig 不合法) EPERM;权限不够无法传送信号给指定进程 ESRCH:参数 pid 所指定的进程或进程组不存在
    示例代码:

 #include 
 #include 
 #include 
 #include 
 #include 
 
 int main( void )
 {
     
     pid_t childpid;
     int status;
     int retval;
     
     childpid = fork();
     if ( -1 == childpid )
     {
     
         perror( "fork()" );
         exit( EXIT_FAILURE );
     }
     else if ( 0 == childpid )
     {
     
         puts( "In child process" );
         sleep( 100 );//让子进程睡眠,看看父进程的行为
         exit(EXIT_SUCCESS);
     }
     else
     {
     
         if ( 0 == (waitpid( childpid, &status, WNOHANG )))
         {
     
             retval = kill( childpid,SIGKILL );
             
             if ( retval )
             {
     
                 puts( "kill failed." );
                 perror( "kill" );
                 waitpid( childpid, &status, 0 );
             }
             else
             {
     
                 printf( "%d killed\n", childpid );
             }
             
         }
     }
     
     exit(EXIT_SUCCESS);
 }
 //-----------------
 [root@localhost src]# gcc killer.c
 [root@localhost src]# ./a.out
 In child process
 4545 killed	
 

你可能感兴趣的:(Linux,linux,c语言)