【问题标题】:How to trigger SIGUSR1 and SIGUSR2?如何触发 SIGUSR1 和 SIGUSR2?
【发布时间】:2011-05-29 15:40:18
【问题描述】:

我开始熟悉 C 语言中的信号。我不知道SIGUSR1SIGUSR2 是什么类型的信号以及如何触发它们。谁能给我解释一下?

【问题讨论】:

    标签: c signals


    【解决方案1】:

    它们是用户定义的信号,因此它们不会被任何特定操作触发。您可以以编程方式显式发送它们:

    #include <signal.h>
    
    kill(pid, SIGUSR1);
    

    其中pid 是接收进程的进程ID。在接收端,您可以为它们注册一个信号处理程序:

    #include <signal.h>
    
    void my_handler(int signum)
    {
        if (signum == SIGUSR1)
        {
            printf("Received SIGUSR1!\n");
        }
    }
    
    signal(SIGUSR1, my_handler);
    

    【讨论】:

    • 感谢您的回答。如果这些信号是用户定义的,它们如何有用?可以举几个例子吗?
    • @haunted:它们是为简单的进程间通信 (IPC) 而设计的。例如,一个子进程可以将它发送给它的父进程,以表明它已经完成了某个任务。显然,IPC 存在更复杂的技术(例如管道、套接字、信号量等)。
    • @haunted85:一个具体的例子是 mongodb 在收到 SIGUSR1 时旋转它的日志文件: - 见docs.mongodb.org/manual/tutorial/rotate-log-files
    • @haunted85 这是一个使用SIGUSR1 用于AIO 的示例:linux.die.net/man/7/aio
    • QEMU 大量使用这种技术来启动 cpu 模型。
    【解决方案2】:

    1号航站楼

    dd if=/dev/sda of=debian.img
    

    2号航站楼

    killall -SIGUSR1 dd
    

    返回 1 号航站楼

    34292201+0 records in
    34292200+0 records out
    17557606400 bytes (18 GB) copied, 1034.7 s, 17.0 MB/s
    

    【讨论】:

    • 这不适用于 rsync btw:rsync error: received SIGUSR1 (code 19) at main.c(1434) [sender=3.1.1]
    • 当然,它不必与rsync 一起工作,它只是一个应用程序示例(此处为:dd),它为SIGUSR1 设置一个信号处理程序以获得有用的功能。
    【解决方案3】:

    它们是应用程序开发人员使用的信号。内核不应该将这些发送到进程。您可以使用kill(2) 或使用实用程序kill(1) 发送它们。

    如果您打算使用信号进行同步,您可能需要检查实时信号(信号更多、排队、交货顺序有保证等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2021-11-06
      • 1970-01-01
      • 2021-12-01
      • 2021-12-25
      相关资源
      最近更新 更多