第一题:
//01
typedef struct msg_buf
{
long type;
char text[256];
}msg_t;
int main(int argc, const char *argv[])
{
int fd=open("./ipc",O_EXCL|O_CREAT,0666);
if(fd==-1)
{
close(fd);
}
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1)
{
perror("./ipc");
return 1;
}
while(1)
{
msg_t buf={0};
printf("请输入消息类型:");
scanf("%ld",&buf.type);
while(getchar()!=10);
printf("请输入消息:");
scanf("%s",buf.text);
while(getchar()!=10);
msgsnd(id,&buf,strlen(buf.text),0);
}
return 0;
}
//02
typedef struct smg_buf
{
long type;
char text[256];
}smg_t;
int main(int argc, const char *argv[])
{
int fd=open(",.ipc",O_EXCL|O_CREAT,0666);
if(fd==-1)
{
close(fd);
}
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1)
{
perror("msgget");
return 1;
}
while(1)
{
smg_t buf={0};
printf("请输入消息类型:");
scanf("%ld",&buf.type);
while(getchar()!=10);
msgrcv(id,&buf,sizeof(buf.text),buf.type,0);//IPC_NOWAIT
printf("接收消息为:%s\n",buf.text);
}
return 0;
}
第二题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int fd=open("./home",O_EXCL|O_CREAT,0666);
if(fd==-1){
close(fd);
}
//创建信号灯集IPC对象semget
//获取key值ftok
key_t key = ftok("/home",1); //非0数
//创建信号灯集IPC对象
//获取信号灯集id号
int semid = semget(key,1,IPC_CREAT|0664); //信号灯集中信号灯的个数为1
//信号灯集初始化
semctl(semid,0,SETVAL,1); //将信号灯0的值初始化为1
//PV操作
struct sembuf sem_0 = {0,-1,0}; //信号灯0做P操作(P-V+)
struct sembuf sem_1 = {0,1,0}; //信号灯1做V操作(P-V+)
int res=fork();//创建父子进程
if(res<0){
perror("fork");
return 1;
}
else if(res>0){//父进程
while(1)
{
semop(semid,&sem_0,1); //值:1->0;控制的信号灯个数为0
printf("A\n");
sleep(1);
semop(semid,&sem_1,1); //值:0->1;控制的信号灯个数为1
}
}
else{//子进程
while(1){
semop(semid,&sem_0,1); //值:1->0;控制的信号灯个数为0
printf("a\n");
sleep(1);
semop(semid,&sem_1,1); //值:0->1;控制的信号灯个数为1
}
}
//删除信号灯集IPC对象
semctl(semid,0,IPC_RMID,NULL); //删除信号灯0
semctl(semid,1,IPC_RMID,NULL); //删除信号灯1
return 0;
}
第三题:
写端:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int fd=open("./home",O_EXCL|O_CREAT,0666);
if(fd==-1){
close(fd);
}
//1、创建信号灯集IPC对象semget
//获取key值ftok
key_t key = ftok("/home",1); //非0数
//1.2、创建信号灯集IPC对象
//获取信号灯集id号
int semid = semget(key,1,IPC_CREAT|0664); //信号灯集中信号灯的个数为2
//2、信号灯集初始化
semctl(semid,0,SETVAL,1); //将信号灯0的值初始化为1
//3、创建共享内存IPC对象
key_t shmkey = ftok("/home",2);
int shmid = shmget(shmkey,1024,IPC_CREAT|0664); //共享内大小为1024字节
//4、内存映射
char *buf = shmat(shmid,NULL,0); //NULL为地址由操作系统分配,0为可读可写
//5、PV操作
struct sembuf sem_0 = {0,-1,SEM_UNDO}; //信号灯0做P操作(P-V+)
struct sembuf sem_1 = {0,1,SEM_UNDO}; //信号灯1做V操作(P-V+)
while(1)
{
semop(semid,&sem_0,1); //值:1->0;控制的信号灯个数为1
memset(buf,0,sizeof(buf));
printf("输出消息为:");
scanf("%s",buf);
while(getchar()!=10);
semop(semid,&sem_1,1); //值:0->1;控制的信号灯个数为1
if(strcmp(buf,"exit") == 0)
break;
}
//6、撤销映射
shmdt(buf);
//7、删除共享内存IPC对象
shmctl(shmid,IPC_RMID,NULL);
//8、删除信号灯集IPC对象
semctl(semid,0,IPC_RMID,NULL); //删除信号灯0
semctl(semid,1,IPC_RMID,NULL); //删除信号灯1
return 0;
}
读端:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int fd=open("./home",O_EXCL|O_CREAT,0666);
if(fd==-1){
close(fd);
}
//1、创建信号灯集IPC对象semget
//获取key值ftok
key_t key = ftok("/home",1); //非0数
//1.2、创建信号灯集IPC对象
//获取信号灯集id号
int semid = semget(key,1,IPC_CREAT|0664); //信号灯集中信号灯的个数为2
//2、信号灯集初始化
semctl(semid,0,SETVAL,1); //将信号灯0的值初始化为1
//3、创建共享内存IPC对象
key_t shmkey = ftok("/home",2);
int shmid = shmget(shmkey,1024,IPC_CREAT|0664); //共享内大小为1024字节
//4、内存映射
char *buf = shmat(shmid,NULL,0); //NULL为地址由操作系统分配,0为可读可写
//5、PV操作
struct sembuf sem_0 = {0,-1,SEM_UNDO}; //信号灯0做P操作(P-V+)
struct sembuf sem_1 = {0,1,SEM_UNDO}; //信号灯1做V操作(P-V+)
while(1){
semop(semid,&sem_0,1); //值:1->0;控制的信号灯个数为1
printf("接收消息为:%s\n",buf);
semop(semid,&sem_1,1); //值:0->1;控制的信号灯个数为1
if(strcmp(buf,"exit") == 0)
break;
sleep(1);
}
//6、撤销映射
shmdt(buf);
//7、删除共享内存IPC对象
shmctl(shmid,IPC_RMID,NULL);
//8、删除信号灯集IPC对象
semctl(semid,0,IPC_RMID,NULL); //删除信号灯0
semctl(semid,1,IPC_RMID,NULL); //删除信号灯1
return 0;
}