【发布时间】:2012-06-21 07:59:50
【问题描述】:
IPC (inter process communication) 可以使用信号捕获和信号提升吗?
我做了两个程序。在第一个程序中我处理了信号,而在另一个程序中我只是提出了我想在另一个程序中处理的信号。我工作得很好,但我想使用信号在这两个程序之间进行通信,并且还想用这个 raise 信号发送一些数据字节。我该怎么做?
我也想用这个信号传递消息。我可以做吗?有可能吗?
另外,使用信号的 IPC 机制的优缺点是什么?
以下是我的两个程序的工作代码。这样做,我可以只发出信号和捕获信号,但我想将数据从一个程序传递到另一个程序。
在第二个程序中,我使用了第一个程序的进程 ID。我怎样才能使它动态化?
第一个程序:
/* Example of using sigaction() to setup a signal handler with 3 arguments
* including siginfo_t.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
static void hdl (int sig, siginfo_t *siginfo, void *context)
{
printf("sig no = %d \n", sig);
if(sig == SIGINT)
exit(0);
printf ("Sending PID: %ld, UID: %ld\n",
(long)siginfo->si_pid, (long)siginfo->si_uid);
}
int main (int argc, char *argv[])
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_sigaction = &hdl;
act.sa_flags = SA_SIGINFO;
if (sigaction(SIGUSR1, &act, NULL) < 0) {
perror ("sigaction SIGUSR1");
return 1;
}
if (sigaction(SIGINT, &act, NULL) < 0) {
perror ("sigaction SIGINT");
return 1;
}
while (1)
{
sleep(1);
}
return 0;
}
第二个节目
#include <stdio.h>
#include <signal.h>
void main(void)
{
while (1)
{
sleep(1);
kill(11558, SIGUSR1);
}
}
【问题讨论】:
-
我建议反对对
SIGINT和SIGUSR1等信号使用相同的信号处理程序。让您的信号处理程序尽可能分开。 -
@JoachimPileborg 我该怎么做你能给我链接或一些我在谷歌上找到很多但我没有得到任何东西的教程。
-
对两个不同的调用使用两个不同的
sigaction结构,每个调用都有自己的处理函数。 -
@JoachimPileborg 在下面的回答中,每个人都说我们可以发送任何带有信号的数据。那么它的可能性如何
-
printf() 不是异步信号安全的。所以你不应该从你的处理程序中调用它。见SIG30-C. Call only asynchronous-safe functions within signal handlers 和CWE-828: Signal Handler with Functionality that is not Asynchronous-Safe。