1.进程A向进程B发送信号,该信号的附带信息为一个字符串“Hello world”;
2.进程B完成接收信号的功能,并且打印出信号名称以及随着信号一起发送过来的字符串值。
注释:只有在共享内存或者同一程序的情况下才可以!!
一、在用共享内存
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include<string.h>
#include<linux/shm.h>
char *viraddr;
void tt(int signo,siginfo_t *info,void *p);
{
struct sigaction act;
int sig;
pid_t pid;
pid=getpid();
printf("pid is %d\n",pid);
sigemptyset(&act.sa_mask);
act.sa_sigaction = tt;
act.sa_flags = SA_SIGINFO;//表示信号附带的参数可以被传进来
if(sigaction(SIGUSR1,&act,NULL)<0)
{
printf("sigaction error\n");
return 0;
}
printf("等待接收信号---\n");
pause();
return 0;
}
{
viraddr=(char*)shmat(shmid,0,0); /*附接到进程的虚拟地址空间*/
printf("传递进来的字符串为:\n%s\n",viraddr); /*输出信息内容*/
printf("receive SIGUSR1\n");
printf("信号编码为%d\n",signo);
shmdt(viraddr); /*断开连接*/
shmctl(shmid,IPC_RMID,0); /*撤销共享内存*/
}
send.c
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include<linux/shm.h>
#include<string.h>
{
int shmid; /*定义共享内存内部标识shmid*/
char *viraddr; /*定义附接共享内存的虚拟地址*/
char buffer[]="Hello World"; /*定义存放信息的字符型数组*/
shmid=shmget(0x44,30,0666|IPC_CREAT);/*创建共享内存*/
viraddr=(char*)shmat(shmid,0,0); /*附接到进程的虚拟地址空间*/
strcat(viraddr,buffer);
int a;
printf("接收信号进程的pid为---\n");
scanf("%d",&a);
union sigval tt;
if(sigqueue(a,SIGUSR1,tt)==-1)
{
printf("send error\n");
}
shmdt(viraddr); /*断开附接*/
return 0;
}
二、
在同一程序中的不同进程里
发送方:
int main(int argc, char* const argv[])
{
struct sigaction act;
act.sa_sigaction = sig_action;
act.sa_flags = SA_SIGINFO;
pid_t pid;
if ((pid = fork()) == -1)
{
return 1;
}
else if (pid == 0)
{
sleep(1);
union sigval val;
val.sival_ptr = "hello world";
sigqueue(getppid(), SIGUSR1, val);
exit(0);
}
else
{
sigaction(SIGUSR1, &act, NULL);
wait(NULL);
}
return 0;
}
接收方:
#include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <signal.h>
5 #include <sys/types.h>
6 void myFun(int, siginfo_t*, void *p);
7 int main(int argc, char* argv[])
8 {
9 struct sigaction act;
10 int sig;
11 pid_t pid;
12 pid = getpid();
13 printf("pid is:%d\n",pid);
14
15 sigemptyset(&act.sa_mask);
16 act.sa_sigaction = myFun;
17 act.sa_flags = SA_SIGINFO;
18
19 if(sigaction(SIGRTMIN, &act, NULL)<0)
20 {
21 printf("install sig error\n");
22 return 0;
23 }
while(1)
{
sleep(2);
printf("wait for the signal\n");
}
}
void sig_action(int signo, siginfo_t *info, void *addr)
{
printf("%s\n", (char*)info->si_value.sival_ptr);
}