思维导图
1全双工通信
(1父子进程)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>
typedef struct D
{
long mtype;
char mtex[88];
}msg_t;
int main(int argc, const char *argv[])
{
//创建新子进程
int pid=fork();
if(pid>0)
{
//创建key值
key_t key=ftok("/",'a');
if(key==-1)
{
perror("key error");
return -1;
}
//创建消息队列
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid==-1)
{
perror("msgid");
return -1;
}
//存放队列数据
msg_t buf={.mtype=88};//数据类型
while(1)
{
sleep(1);
printf("这里是1父进程输入:\n");
scanf("%s",buf.mtex);
//消息存入队列
msgsnd(msgid,&buf,88,0);
printf("ok\n");
if(strcmp(buf.mtex,"quit")==0)
{
break;
}
}
//关闭队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl");
return -1;
}
}else if(pid==0)
{
//创建key2值
key_t key2=ftok("../02kill_raise.c",'b');
if(key2==-1)
{
perror("key2 error");
return -1;
}
//创建消息队列
int msgid = msgget(key2,IPC_CREAT|0664);
if(msgid==-1)
{
perror("msgid");
return -1;
}
//存放队列数据
msg_t buf={.mtype=88};//数据类型
while(1)
{
sleep(1);
printf("这里是1子进程输出:");
msgrcv(msgid,&buf,88,0,0);
printf("%s\n",buf.mtex);
printf("ok\n");
if(strcmp(buf.mtex,"quit")==0)
{
break;
}
}
//关闭队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl");
}
}else
{
perror("fork");
return -1;
}
return 0;
}
(2父子进程)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>
typedef struct D
{
long mtype;
char mtex[88];
}msg_t;
int main(int argc, const char *argv[])
{
//创建新子进程
int pid=fork();
if(pid==0)
{
//创建key值
key_t key=ftok("../02kill_raise.c",'b');
if(key==-1)
{
perror("key error");
return -1;
}
//创建消息队列
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid==-1)
{
perror("msgid");
return -1;
}
//存放队列数据
msg_t buf={.mtype=88};//数据类型
while(1)
{
sleep(1);
printf("这里是2子进程程输入:\n");
scanf("%s",buf.mtex);
//消息存入队列
msgsnd(msgid,&buf,88,0);
printf("ok\n");
if(strcmp(buf.mtex,"quit")==0)
{
break;
}
}
//关闭队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl");
return -1;
}
}else if(pid>0)
{
//创建key2值
key_t key2=ftok("/",'a');
if(key2==-1)
{
perror("key2 error");
return -1;
}
//创建消息队列
int msgid = msgget(key2,IPC_CREAT|0664);
if(msgid==-1)
{
perror("msgid");
return -1;
}
//存放队列数据
msg_t buf={.mtype=88};//数据类型
while(1)
{
sleep(1);
printf("这里是2子进程输出:");
msgrcv(msgid,&buf,88,0,0);
printf("%s\n",buf.mtex);
printf("ok\n");
if(strcmp(buf.mtex,"quit")==0)
{
break;
}
}
//关闭队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl");
}
}else
{
perror("fork");
return -1;
}
return 0;
}
2信号发送
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>
void handel(int signum)
{
if(signum==SIGUSR1)
{
while(1)
{
sleep(1);
printf("你的狗命由我来拯救,起死回生\n");
}
}
if(signum==SIGINT)
{
printf("你觉得你能杀死我?\n");
}
}
int main(int argc, const char *argv[])
{
pid_t pid=fork();
if(pid>0)
{
printf("这里是父进程、\n");
if(signal(SIGUSR1,handel)==SIG_ERR)
{
perror("");
return -1;
}
if(signal(SIGINT,handel)==SIG_ERR)
{
perror("");
return -1;
}
while(1)
{
sleep(1);
printf("我造!,让我推个塔啊!\n");
}
}else if(pid==0)
{
printf("这里是子进程\n");
sleep(5);
printf("发发发,寄!\n");
kill(getppid(),SIGUSR1);
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
return 0;
}
3共享内存段
(发送)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>
#define SIZE 4096
int main(int argc, const char *argv[])
{
//创建共享内存段的key
key_t key=ftok("../02kill_raise.c",'a');
if(key==-1)
{
perror("ftok error");
return -1;
}
//创建打开共享内存段
int shmid=shmget(key,SIZE,IPC_CREAT | 0664);
if(shmid==-1)
{
perror("shimid error");
return -1;
}
//将创建的内存段映射到用户空间
char *addr=shmat(shmid,NULL,0);
if(addr==(void *)-1)
{
perror("");
return -1;
}
//写入内容
while(1)
{
printf("please enter:\n");
fgets(addr,SIZE,stdin);
addr[strlen(addr)-1]='\0';
if(strcmp(addr,"quit")==0)
{
break;
}
}
//关闭映射内存段
if(shmdt(addr)==-1)
{
perror("shmdt");
return -1;
}
//删除共享内存
if(shmctl(shmid,IPC_RMID,NULL)==-1)
{
perror("shmctl error");
}
return 0;
}
(接收)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<head.h>
#define SIZE 4096
int main(int argc, const char *argv[])
{
//创建共享内存段的key
key_t key=ftok("../02kill_raise.c",'a');
if(key==-1)
{
perror("ftok error");
return -1;
}
//创建打开共享内存段
int shmid=shmget(key,SIZE,IPC_CREAT | 0664);
if(shmid==-1)
{
perror("shimid error");
return -1;
}
//将创建的内存段映射到用户空间
char *addr=shmat(shmid,NULL,0);
if(addr==(void *)-1)
{
perror("");
return -1;
}
//写入内容
while(1)
{
sleep(1);
printf("out:");
puts(addr);
if(strcmp(addr,"quit")==0)
{
break;
}
}
//关闭映射内存段
if(shmdt(addr)==-1)
{
perror("shmdt");
return -1;
}
return 0;
}