kill,alarm,raise,abort,pause,signal等函数的使用

这篇具有很好参考价值的文章主要介绍了kill,alarm,raise,abort,pause,signal等函数的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.1 kill

kill函数是UNIX和类UNIX操作系统中的一个标准库函数,主要用于向指定进程发送信号。

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signum);

pid_t pid 是进程ID,int signum 是信号的编号。

kill函数的作用是将signum指定的信号发送到pid指定的进程

  • pid > 0:将信号发送给进程ID为pid的进程。
  • pid = 0:将信号发送给当前进程所在的整个进程组中的所有进程。
  • pid < 0:将信号发送给进程组ID等于pid的绝对值的进程组中的所有进程。
  • pid = -1:将信号发送给系统中的所有进程,这个进程组号等于pid的绝对值。

kill函数的成功返回值为0,失败返回值为-1

此外,调用kill函数的进程必须有权限向目标进程发送信号。通常,只有root用户才能向所有进程发送信号,而非root用户只能向与自己用户ID相同的进程发送信号

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <signal.h>
 #include <sys/types.h>
 
  int main()
  {
     pid_t pid;
 
     pid = fork();
     if(pid < 0)
     {
         perror("fail to fork");
         exit(1);
     }
     else if(pid > 0) //父进程的代码区
    {
         while(1)
         {
             printf("This is parent peocess\n");
             sleep(1);
         }
    }
     else //子进程的代码区 
    {
     printf("This is son process\n");
     //子进程在3秒之后,让父进程退出
    sleep(3);
     //使用kill给父进程发送信号,然后父进程接收到信号后直接退出就可以了
    kill(getppid(), SIGINT);
     }
      return 0;
   }

执行结果

kill,alarm,raise,abort,pause,signal等函数的使用,信号,linux,服务器,c语言,ubuntu,网络,windows

 1.2 alarm函数

alarm函数是UNIX和类UNIX系统中的一种标准库函数,它的主要作用是为当前进程设置一个定时器。

当设定时间到达后,定时器会向当前进程发送SIGALRM信号。

这个信号的默认行为是终止进程,但如果进程中有一个已注册的信号处理函数来处理SIGALRM信号,那么进程会根据该函数的逻辑来执行相应的操作

#include <sys/time.h>
unsigned int alarm(unsigned int seconds);

seconds参数

指定了定时器的超时时间,单位是秒。

如果seconds的值为0,那么之前设置的定时器会被取消,并且返回之前定时器剩余的时间。

如果seconds的值为-1,那么返回的是0

alarm函数的返回值有以下几种情况

  • 如果seconds的值为0,返回值也是0。
  • 如果seconds的值大于0,并且在seconds秒内再次调用了alarm函数设置了新的定时器,那么返回值是之前定时器剩余的秒数。
  • 如果seconds的值大于0,并且没有在seconds秒内再次调用alarm函数设置新的定时器,那么返回值是0

案例

#include <stdio.h>
#include <unistd.h>
#int main()
 {
     unsigned int sec; 

     //当执行到alarm之后,代码会接着往下执行,当设定的时间到后,会产生SIGALRM信
     //如果alarm之前没有设置其他闹钟,则返回0,如果之前设置了,则返回之前剩余的
     //如果一个程序中出现多个alarm闹钟,第一个如果没有到达指定的时间就遇到第二个
     //则第一个的闹钟时间清除,按照第二个alarm闹钟的时间继续向下运行
     sec = alarm(5);
     printf("sec = %d\n", sec);
     sleep(3);
     sec = alarm(6);
     printf("sec = %d\n", sec);
     while(1)
     {
         printf("hello world\n");
         sleep(1);
     }
     return 0;
}

执行结果

kill,alarm,raise,abort,pause,signal等函数的使用,信号,linux,服务器,c语言,ubuntu,网络,windows

  1.3 raise函数

raise函数主要用于向当前进程发送一个信号。这个函数的原型如下:

#include <signal.h>
int raise(int sig);

sig参数是你想要发送的信号的名字

。这个函数的工作原理是,当你调用raise函数并传入一个特定的信号名时,它会向当前进程发送这个信号

返回值:  成功:0  

                失败:非0

raise(sig)  等同于   kill(getpid(), sig)

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <unistd.h>
 #include <sys/types.h>
 
  int main(int argc, char const *argv[])
 {
     int num = 0;
 
       while(1)
       {
         printf("hello world\n");
         sleep(1);
         num++;
         //当循环执行5秒后,进程退出
          if(num == 5)
          {
             //使用raise给当前进程本身发送信号
               raise(SIGALRM);
             //等同于kill(getpid(), SIGALRM);
          }
        }
 
     return 0;
  }

执行结果

kill,alarm,raise,abort,pause,signal等函数的使用,信号,linux,服务器,c语言,ubuntu,网络,windows

1.4 abort函数 

abort函数是C语言中的一个标准库函数,其原型定义在<stdlib.h>头文件中

该函数的主要作用是使当前的进程异常终止,即立即停止当前正在执行的程序,而不进行正常的资源回收和清理工作。

 #include <stdlib.h>
 void abort(void);
 功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。
   参数:无
 返回值:无

 注意即使SIGABRT信号被加入阻塞集,一旦进程调用了abort函数,进程也还是会被终止, 且在终止前会刷新缓冲区,关闭文件描述符。

案例

  #include <stdio.h>
  #include <stdlib.h>
  #include <signal.h>
  #include <unistd.h>
  #include <sys/types.h>
 
  int main()
  {
     int num = 0;
 
     while(1)
     {
         printf("hello world\n");
         sleep(1);
         num++;
 
        //当循环执行5秒后,进程退出
          if(num == 5)
          {
             abort();
          }
      }
        return 0;
   }

执行结果

kill,alarm,raise,abort,pause,signal等函数的使用,信号,linux,服务器,c语言,ubuntu,网络,windows

1.5 pause函数

pause函数作用是使当前进程进入等待状态,直到接收到一个信号为止。

这个函数通常用于等待某个特定的事件发生,例如等待用户输入或者等待某个条件满足。

#include <sys/wait.h>

int pause(void);

返回值当有信号产生时,函数返回‐1

案例

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <signal.h>
 #include <sys/types.h>
 
  int main()
  {
     pid_t pid;
     pid = fork();
     if(pid < 0)
     {
        perror("fail to fork");
        exit(1);
     }
     else if(pid > 0) //父进程的代码区
     {
         printf("This is parent peocess\n");
        //使用pause阻塞等待捕捉信号
         pause();
     }
     else //子进程的代码区 
     {
         printf("This is son process\n");
         sleep(3);
         kill(getppid(), SIGINT);//睡眠三秒后杀死父进程
     }
     
         return 0;
  } 

执行结果

kill,alarm,raise,abort,pause,signal等函数的使用,信号,linux,服务器,c语言,ubuntu,网络,windows

1.6 signal函数

signal函数是用于设置一个特定的信号处理函数的标准库函数。

当进程接收到一个信号时,signal函数允许你指定一个函数来处理这个信号。

 #include <signal.h>
  void (*signal(int sig, void (*func)(int)))(int);
 ‐‐>
 typedef void (*sighandler_t)(int);
 sighandler_t signal(int signum, sighandler_t handler);
  功能:当进程中产生某一个信号时,对当前信号进行处理
  参数:
 
  sig:指定要处理的信号
    handler:处理方式
    SIG_IGN 当信号产生时,以缺省(忽略)的方式处理
    SIG_DFL 当信号产生时,以当前信号默认的方式处理

func是你想要设置的信号处理函数。信号处理函数必须具有以下形式

void func(int sig);

当信号产生时,通过信号处理函数自定义方式处理,函数名可以随便写,参数表示当前的信号

 返回值: 成功:返回函数地址,该地址为此信号上一次注册的信号处理函数的地址

                 失败:SIG_ERR

1.6.1  signal函数的使用

 #include <stdio.h>
 #include <signal.h>
 #include <unistd.h>
 #include <stdlib.h>
 
  void handler(int sig);
 
  int main(int argc, char const *argv[])
{
     //以默认的方式处理信号
  #if 0
     if(signal(SIGINT, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, SIG_DFL) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
  #endif
 
     //以忽略的方式来处理信号
  #if 0
     if(signal(SIGINT, SIG_IGN) == SIG_ERR)
     {
        perror("fail to signal");
         exit(1);
     }
    if(signal(SIGQUIT, SIG_IGN) == SIG_ERR)
     {
        perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, SIG_IGN) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
 
     //注意:SIGKILL和SIGSTOP这两个信号只能以默认的方式处理,不能忽略或者捕捉
    // if(signal(SIGKILL, SIG_IGN) == SIG_ERR)
     // {
     //     perror("fail to signal");
     //     exit(1);
     // }
 
  #endif    

     //以用户自定义方式处理信号
 #if 1
     if(signal(SIGINT, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGQUIT, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
     if(signal(SIGTSTP, handler) == SIG_ERR)
     {
         perror("fail to signal");
         exit(1);
     }
 #endif  

     while(1)
     {
         printf("hello world\n");
         sleep(1);
     }
         return 0;
}
  

  void handler(int sig)
  {
     if(sig == SIGINT)
     {
         printf("SIGINT正在处理\n");
     }
 
     if(sig == SIGQUIT)
     {
        printf("SIGQUIT正在处理\n");
     }
 
     if(sig == SIGTSTP)
     {
         printf("SIGTSTP正在处理\n");
     }
  }

在使用signal函数时,还需要考虑信号处理的同步和互斥问题,以确保程序的正确性和稳定性文章来源地址https://www.toymoban.com/news/detail-856351.html

到了这里,关于kill,alarm,raise,abort,pause,signal等函数的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux中的alarm和setitimer定时器函数以及信号捕捉函数signal和sigaction

    通过 man 2 alarm 查看alarm函数的详细信息。 功能: 设置定时器(闹钟)。从调用这个函数开始进行倒计时,倒计时结束之后(变为0),函数会给当前的进程发送 SIGALARM 信号。 参数: seconds: 倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发信号)。取

    2024年02月03日
    浏览(53)
  • linux 信号原理 信号处理设置signal, 信号发送kill,信号等待sigsuspend,信号阻塞sigprocmask,一网打尽信号使用

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ================================ 信号是一种软中断的方式,让进程陷入中断处理调用中; linux 下信号也是一种进程间通信的手段;进

    2024年02月13日
    浏览(39)
  • 【Linux系统编程】26.信号、kill、alarm、setitimer

    目录 信号 信号共性 信号特质 产生信号 信号相关概念 默认处理动作 信号4要素 常规信号  ​编辑 注意 kill 参数pid 测试代码1 测试结果 测试代码2 测试结果 alarm 参数seconds 返回值 取消闹钟 测试代码3 测试结果1 测试结果2  ​编辑 setitimer 参数which 参数new_value 参数old_value 测试

    2024年04月28日
    浏览(40)
  • Linux系统调用之signal,sigaction函数 (捕捉指定的信号,自定义/默认处理该信号)

    如果,想要深入的学习Linux系统调用中的signal,sigaction函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: 即可查阅到完整的资料信息。 signal()是一个用于处理Unix和类Unix操作系统(如Linux)中的信号的系统调用。信号是用于在进程间或者进程内部传递通知或者

    2024年02月02日
    浏览(44)
  • 【TCP/IP】多进程服务器的实现(进阶) - 信号处理及signal、sigaction函数

    目录 信号 signal函数 sigaction函数 用信号来处理僵尸进程          在之前我们学习了如何处理“僵尸进程”,不过可能也会有疑问:调用wait和waitpid函数时我们关注的始终是在子进程上,那么在父进程上如何实现对子进程的管控呢?为此,我们引入一个概念——信号处理。

    2024年02月08日
    浏览(59)
  • RuntimeError: DataLoader worker is killed by signal: Killed.报错解决

    一、问题描述 使用pytorch进行训练时,训练了仅几个batch后出现报错信息: 这个报错和DataLoader有关,定位到训练脚本中的代码: 二、问题分析 通过设置num_workers,DataLoader实例可以使用多少个子进程进行数据加载,从而加快网络的训练过程。 默认情况下,num_workers值被设置为

    2024年02月12日
    浏览(36)
  • MongoDB 启动提示错误code=killed, signal=ABRT

    如果不赋权限,启动的时候则会提示 启动成功!

    2024年02月03日
    浏览(29)
  • 【genius_platform软件平台开发】第九十七讲:linux设备驱动中信号(signal函数)的异步通知机制

    意思是: 一旦设备就绪,则主动通知应用程序 ,这样应用程序根本就不需要查询设备状态,这一点非常 类似于硬件上“中断”的概念 ,比较准确的称谓是“ 信号驱动的异步I/O ”。信号是在软件层次上对 中断机制的一种模拟 ,在原理上,一个进程收到一个信号与处理器收到一

    2024年02月08日
    浏览(61)
  • collect2: fatal error: ld terminated with signal 9 [Killed]

    在 WSL2 中编译 LLVM遇到了如下报错: collect2: fatal error: ld terminated with signal 9 [Killed] 经过查询,发现是因为内存不足,造成进程被killed。 默认WSL2 的内存是主机内存的50%或者8GB。因此提高内存上限即可。如果主机内存有限,可以增大swap的大小。默认 swap大小为内存的25%。 WSL2 的

    2024年02月15日
    浏览(37)
  • LLVM编译报错解决:collect2: fatal error: ld terminated with signal 9 [Killed]

    克隆代码到本地 配置编译选项 generator一般使用Ninja,而 options 中必须要传入的参数是构建类型 CMAKE_BUILD_TYPE 不同的CMAKE_BUILD_TYPE区别如下: Build Type Optimization Debug Info Assertion Release For Speed No No Debug None Yes Yes RelWithDebInfo For Speed Yes No MinSizeRel For Size No No Release适合LLVM和Clang的用户

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包