• Linux下对后台进程通过kill传递信号不起作用的问题


    在阅读APUE信号一章时,我遇到Linux下对后台进程通过kill传递信号不起作用的问题

    具体情形与如下链接中的老兄一致:

    http://bbs.csdn.net/topics/390335913?page=1#post-395188120

    编译执行下面的信号程序,然后再shell命令行:先让程序在后台运行,得到进程ID,然后用kill向该进程发送信号:kill -USR1 ID,但是没有结果

    #include "apue.h"
    
    static void sig_usr(int);
    int main(void)
    {
    if(signal(SIGUSR1,sig_usr)==SIG_ERR)
      err_sys("can not catch SIGUSR1");
    if(signal(SIGUSR2,sig_usr)==SIG_ERR)
      err_sys("can not catch SIGUSR2");
    for( ; ; )
        pause();
    }
    static void sig_usr(int signo)
    {
    if(signo==SIGUSR1)
       printf("received sIGUSR1
    ");
    else	if(signo==SIGUSR2)
       printf("received sIGUSR2
    ");
    else
       err_dump("received signal %d
    ",signo);
    }


    这是我的解决方案:

    这个问题应该是linux的进程后台运行的实现问题。可以换种方法进行实验:
    1 在程序中加入打印getpid()函数
    2 在前台运行该程序
    3 新开一个终端窗口,在新开的终端窗口中输入:kill -USR1 [pid]
    4 返回原终端,查看实验结果


    kill

    功能说明:删除执行中的程序或工作。

    语 法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

    补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。 
    参 数:
    -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。 
    -s <信息名称或编号>  指定要送出的信息。 
    [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。 


  • 相关阅读:
    链接数据库
    Ajax 密码验证
    for循环 打印菱形 空 和 实
    for 循环 正方形
    面向对象
    用正则表达式 匹配手机号码
    正则表达式
    js 中 == 和=== 有什么区别?
    js 删除
    封装函数增删改查
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3230975.html
Copyright © 2020-2023  润新知