C -Signal处理中的Ctrl-C问题

时间:2013-12-01 12:06:24

标签: c

我对信号处理有疑问。

假设我有两个程序同时运行。我称之为program1和program2。

我在不同的终端窗口运行它们,因为一个程序等待另一个程序启动。它们被设计为继续前进,直到我在两个窗口中按下ctrl-c。我觉得这种方法有点麻烦。所以我想做的是在其中一个程序中添加一些内容。

意思是,我可以使用ctrl-c来停止program1,一旦知道program1不再有效,program2就会停止。我在网上查看是否有一个这样的例子,或者我不知道的C语言的一部分,我遇到了信号处理。

我知道信号处理涉及使程序执行各种执行,具体取决于给定的信号或信号的结构。这是正确的使用方法还是有另一种方法?

我在网上看到,如果信号是ctrl-C,那么使用信号处理会在终端中搞乱ctrl-C命令?

对于信号处理的解释以及一些示例代码也将非常受欢迎。

根据给出的答案,我根据给出的内容编写了一个示例代码:

#include <signal.h>
......
......
sigset_t SIGUSR1;
sigset_t SIGUSR2;
int signal;

void trap(int signal);
......
......
void trap(int signal)
{
int signal;
signal == SIGUSR1
}

很抱歉,如果我写这篇文章看起来很愚蠢,但我仍然想知道它是如何工作的。

2 个答案:

答案 0 :(得分:1)

您可以使用标题signal.h处理信号 使用CTRL+C

处理SIGINT

它可能像:

   void func(int sig)
    {
    switch(sig)
    {
    case SINGINT:
    //Do whatever you want
    break;
    default :
    break;
    }
    }

    int main()
    {
    //Handle SIGINT
    signal(SIGINT,func);

    return 0;
    }

答案 1 :(得分:0)

“或者还有另一种方式吗?” - 这是一个UNIX倾斜的答案。

这个主题非常广泛 - 它被称为IPC - 进程间通信。合作过程可以使用大量方法相互“交谈”,信号只是一个,这里有一些方法:

signals
shared memory objects
sockets
message queues
files

信号是名称SIG [something],并在内部以数字形式表示给内核。 kill -l会列出可用的信号及其名称。 SIGUSR1和SIGUSR2用于用户应用程序相互通信。考虑使用它们。不要担心SIGUSR1代表的数字,只需在代码中使用该名称即可。

使用信号:在接收时捕获信号并设置全局变量。在发送端,您可以调用kill()功能。

终端使用SIGINT(CTRL / C)来停止或中断正在运行的进程。因此,请考虑使用SIGUSR1和SIGUSR2。通过抢占SIGINT,你会发现你可能会创建一个需要使用CTRL / C的情况。但是它被你的代码所困,所以它没有任何效果。 SIGUSRn没有这个问题。因此,您不必担心竞争单个信号的使用(多重含义)。

Linux详情: 从tldp.org尝试此链接:http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf

编辑:

prog1,等待的人:

volatile int go=0;
void s_handler(int sig)
{
   go=1;
}


int main()
{
  signal(SIGUSR1, s_handler);
  while(go==0)
    usleep(500);
  //  run the rest of the code here when I wake up
  return 0;
}

prog2,唤醒prog1的那个 - 你需要prog1的pid。 将pid作为命令行参数prog2 [pid goes here]

传递
int main(int argc, char **argv)
{
  if(argc>1)
  {
     pid_t pid=(pid_t)atoi(argv[1]);
     if(kill(pid, 0)==0 &&  kill(pid, SIGUSR1)!=0)// check pid, then signal
     {
        perror("Can't send signal to other process");
        exit(1);
     }
  }
  // run the rest of the code here
  return 0;
}

没有一种最正确的方法来处理IPC。选一个。以上使用信号。

只检查基本逻辑没有错误。另一种方法是让prog1将pid写入文件,然后prog2读取文件,读取并使用该pid,然后删除文件。而不是命令行参数。

你决定。