2

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

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

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

4

2 回答 2

7

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 都用SIGRTMIN和表示SIGRTMAX。这些是用户可以征用的信号,而不必担心干扰系统通常想要做的任何事情。在 Perl 中,您可以使用助记符 like 为它们分配信号处理程序,NUM35并使用助记符 ( kill 'NUM37', $pid) 或仅使用信号编号 ( kill 37, $pid) 发送信号。

于 2013-08-07T15:53:55.840 回答
0

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

#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/

于 2015-12-01T16:57:52.493 回答