【问题标题】:Create a new signal in linux在linux中创建一个新信号
【发布时间】:2013-08-07 15:26:30
【问题描述】:

有没有办法在 linux 中创建自定义信号。就像让我们说什么时候在文件中执行“回声疯狂”?每当执行该信号时,我都会使用该信号停止该过程... 我也想使用带有新信号的 perl Enbugger。有没有办法做到这一点? 我是从http://metacpan.org/pod/Enbugger找到这个的

 use Enbugger::OnError qw( USR1 USR2 INT HUP );

其中 USR1 和 USR2 是用户定义的信号。

【问题讨论】:

  • @Anshul 你好,我实际上不知道信号可能包含什么,回声疯狂是否符合信号?
  • 没有信号只是纯整数。您需要将事件映射到信号。您可能甚至不需要 USR1 或 USR2。如果你能给出更多关于这种情况的例子,我可以提供帮助。 (什么会产生/'echo crazy'会来自哪里,什么会监控它?
  • 我有一些以随机顺序运行的测试文件。在这些文件中有一个特殊的命令。我只想在每次执行该命令时运行一个文件。我想如果我在命令上附加一个信号,然后捕捉到这个信号,我可能会实现一些东西
  • @Anshul,您能否指导我使用一些资源来将事件映射到信号,然后以某种方式在另一个文件中使用该信号。我的意思是任何资源都会很好

标签: linux perl debugging process signals


【解决方案1】:

Perl 中的信号处理利用了操作系统的信号功能,通常具有预定义和固定的信号集。但是许多系统确实分配了没有任何特定目的的“额外”信号,这些信号可能被用户进程使用。例如,我的 Red Hat 系统提供以下信号:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

您可以看到信号 34 到 64 都用SIGRTMINSIGRTMAX 表示。这些是用户可以征用的信号,而不必担心干扰系统通常想要做的任何事情。在 Perl 中,您可以使用诸如 NUM35 之类的助记符为它们分配信号处理程序,并使用助记符 (kill 'NUM37', $pid) 或仅使用信号编号 (kill 37, $pid) 发送信号。

【讨论】:

  • 您能否告诉我如何将正在运行的命令解释为信号。我的意思是如何使命令事件被视为对其他文件的信号?
  • 命令不作为信号运行。命令可以发送信号,在 Perl 中,这是通过内置的 kill 完成的。命令可以接收信号,并且在 Perl 中,您可以管理(对于大多数信号)当您接收到带有 %SIG 变量的信号时会发生什么。信号发送到文件。信号被发送到进程(或线程,这是另一种蠕虫)。
【解决方案2】:

信号就像一个中断,当它由用户级产生时,会调用操作系统的内核,它会做出相应的动作。 创建信号,这里我只是给你看一个例子

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>   
void sig_handler1(int num)
{
  printf("You are here becoz of signal:%d\n",num);  
  signal(SIGQUIT,SIG_DFL);
}
void sig_handler(int num)
{
   printf("\nHi! You are here becz of signal:%d\n",num);
}
int main() 
{
   signal(SIGINT,sig_handler1);
   signal(SIGQUIT,sig_handler);
   while(1)
   {
       printf("Hello\n");
       sleep(2);
   }

}

运行此代码后,如果您按下 Ctrl+C,则会显示一条消息 - “您在这里,因为信号:2”而不是退出进程,因为我们已根据我们的操作更改了信号。因为,Ctrl+C 是可屏蔽信号。

要了解更多关于信号和信号类型的例子,请点击链接:

http://www.firmcodes.com/signals-in-linux/

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多