我对信号处理有疑问。
假设我有两个程序同时运行。我称之为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
}
很抱歉,如果我写这篇文章看起来很愚蠢,但我仍然想知道它是如何工作的。
答案 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,然后删除文件。而不是命令行参数。
你决定。