**
信号实现进程间发送接收数据
**
原文链接:https://www.jianshu.com/p/f445bfeea40a
信号注册思路大纲:
1.信号注册安装代码实现:
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
// int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
// void (*sa_sigaction)(int, siginfo_t *, void *);
void handler(int signum, siginfo_t *info, void *context)
{
printf("the signum: %d\n", signum);
if (context != NULL){
printf("get the message: %d\n", info->si_int); //si_int与si_value.sival_int的值是一样的
printf("get the message: %d\n", info->si_value.sival_int);
printf("Sending process ID: %d\n", info->si_pid);
}
}
int main(int argc, char *argv[])
{
printf("the ID of this process: %d\n", getpid());
struct sigaction act;
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO; //将sa_flags设置为SA_SIGINFO是为了能够接受数据信息
sigaction(SIGUSR1, &act, NULL);
while(1);
return 0;
}
~
2.信号数据发送端:
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int signum;
int pid;
signum = atoi(argv[1]);
pid = atoi(argv[2]);
//int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval value;
value.sival_int = 24;
sigqueue(pid, signum, value);
printf("this process ID: %d\n", getpid());
return 0;
}
3.发送端、接收端代码运行结果:
ps:如果要传递字符串,就需要使用共享内存进程跨进程来传递,信号相比于共享内存,也要复杂一点。