实现AB进程对话。
a. A进程发送一句话,B进程接收到打印。然后B进程发送一句话, A进程接收后打印
b.复上述步骤。直到AB接收或者发送完quit后,结束AB进程
1 #include <myhead.h>
2 struct msgbuf
3 {
4 long mtype;//消息类型 必须大于0
5 char mtext[128]; //消息内容
6 };
7
8
9 int main(int argc, const char *argv[])
0 {
1 //创建健值
2 key_t key = ftok("./",1);
3 if(key<0)
4 {
5 perror("ftok");
6 return -1;
7
8 }
9 //printf("key = %d\n",key);
0
1 //通过key值查找消息队列,若队列存在则找到消息队列
2 //若不存在,则先创间,再找到该队列
3
4 int msgid = msgget(key,IPC_CREAT|0664);
5 if(msgid<0)
6 {
7 perror("msgid");
8 return -1;
9
0 }
1 //printf("msgid = %d\n",msgid);
2
3
4 //向消息队列中发送数据(B发送)
5 //需要先将数据打包好
6 struct msgbuf snd;
7 struct msgbuf rcv;
8 while(1)
9 {
0 ssize_t res;
1 printf("B请输入消息类型\n");
2 scanf("%ld",&snd.mtype);
3 getchar();
4 printf("B请输入消息内容\n");
5 fgets(snd.mtext,sizeof(snd.mtext),stdin);
6 snd.mtext[strlen(snd.mtext)-1]='\0';
7
8 if(strcmp(snd.mtext,"quit") == 0)
9 {
0 break;
1
2 }
3 if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0)
4 {
5 perror("msgsnd");
6 return -1;
7 }
8 printf("B发送成功\n");
9
0
1
2
3 //从队列中读取数据B接收
4 res = msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,IPC_NOWAIT);
5 if(res<0)
6 {
7 perror("msgrcv");
8 return -1;
9
0 }
1 if(strcmp(rcv.mtext,"quit")==0)
2 {
3 break;
4
5 }
6 printf("A说: %s\n",rcv.mtext);
7 }
8
9
0 //删除消息队列
1 if(msgctl(msgid,IPC_RMID,NULL)<0)
2 {
3 perror("msgctl");
4 return -1;
5 }
6
7
8
9 //删除消息队列
0 //system("ipcs -q");//可以让c代码执行shell指令
1 return 0;
2 }
1 #include <myhead.h>
2 struct msgbuf
3 {
4 long mtype;//消息类型 必须大于0
5 char mtext[128]; //消息内容
6 };
7
8
9 int main(int argc, const char *argv[])
0 {
1 //创建健值
2 key_t key = ftok("./",1);
3 if(key<0)
4 {
5 perror("ftok");
6 return -1;
7
8 }
9 //printf("key = %d\n",key);
0
1 //通过key值查找消息队列,若队列存在则找到消息队列
2 //若不存在,则先创间,再找到该队列
3
4 int msgid = msgget(key,IPC_CREAT|0664);
5 if(msgid<0)
6 {
7 perror("msgid");
8 return -1;
9
0 }
1 //printf("msgid = %d\n",msgid);
2
3
4 //向消息队列中发送数据
5 //需要先将数据打包好
6 ssize_t res = 0;
7 struct msgbuf rcv;
8 struct msgbuf snd;
9 //从队列中读取数据B接收
0 while(1)
1 {
2 res = msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,IPC_NOWAIT);
3 if(res<0)
4 {
5 perror("msgrcv");
6 return -1;
7
8 }
9 if(strcmp(rcv.mtext,"quit")==0)
0 {
1 break;
2
3 }
4 printf("B说: %s\n",rcv.mtext);
5
6
7 //A发送
8 printf("A请输入消息类型\n");
9 scanf("%ld",&snd.mtype);
0 getchar();
1 printf("A请输入消息内容\n");
2 fgets(snd.mtext,sizeof(snd.mtext),stdin);
3 snd.mtext[strlen(snd.mtext)-1]='\0';
4
5 if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0)
6 {
7 perror("msgsnd");
8 return -1;
9 }
0 if(strcmp(snd.mtext,"quit")==0)
1 {
2 break;
3
4 }
5 printf("A发送成功\n");
6
7
8 }
9
0 system("ipcs -q");//可以让c代码执行shell指令
1 //删除消息队列
2 if(msgctl(msgid,IPC_RMID,NULL)<0)
3 {
4 perror("msgctl");
5 return -1;
6 }
7
8
9 system("ipcs -q");//可以让c代码执行shell指令
0 return 0;
1 }
要求在共享内存中存入字符串“1234567"。A进程循环打印字符串,B进程循环倒置字符串,要求结果不允许出现乱序:提示:共享内存+信号灯集
include <myhead.h>
nt main(int argc, const char *argv[])
key_t key = ftok("./",1);
if(key<0)
{
perror("key");
return -1;
}
//创建共享内存
int shmid = shmget(key,128,IPC_CREAT|0664);
if(shmid <0 )
{
perror("shmid");
return -1;
}
printf("shmid = %d\n",shmid);
//创建信号灯集
int semid = semget(key,2,IPC_CREAT|0664);
if(semid<0)
{
perror("semid");
return -1;
}
//将共享内存映射到用户空间i去
void* addr = shmat(shmid,NULL,0);
if(addr == (void*)-1)
{
perror("shmat");
return -1;
}
//写入数据
char* str = (char*)addr;
strcpy(str,"123456");
struct sembuf sop;
//p操作
while(1)
{
sop.sem_num = 1;///控制1号灯
sop.sem_op =-1;//p操作
sop.sem_flg = 0;//阻塞方式
if(semop(semid,NULL,1)<0)
{
perror("semop1");
return -1;
}
sop.sem_num = 0;///控制0号灯
sop.sem_op =+1;//v操作
sop.sem_flg = 0;//阻塞方式
if(semop(semid,NULL,1)<0)
{
perror("semop");
return -1;
}
}
//删除共享内存
//shmctl(shmid,IPC_RMID,NULL);
//system("ipcs -m");
return 0;
#include <myhead.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",1);
if(key<0)
{
perror("key");
return -1;
}
//创建共享内存
int shmid = shmget(key,128,IPC_CREAT|0664);
if(shmid <0 )
{
perror("shmid");
return -1;
}
printf("shmid = %d\n",shmid);
//创建信号灯集
int semid = semget(key,2,IPC_CREAT|0664);
if(semid<0)
{
perror("semid");
return -1;
}
//将共享内存银蛇到用户空间i去
void* addr = shmat(shmid,NULL,0);
if(addr == (void*) -1 )
{
perror("shmat");
return -1;
}
char* i = (char*)addr;
char* j = NULL;
char temp =0;
struct sembuf sop;
while(1)
{
sop.sem_num = 0;
sop.sem_op = -1;
sop.sem_flg = 0;
if(semop(semid,&sop,1)<0)
{
perror("semop");
return -1;
}
j=i+(strlen(i)-1);
while(i<j)
{
temp=*i;
*i=*j;
*j=temp;
i++;
j--;
}
sop.sem_num =1;
sop.sem_op = +1;
sop.sem_flg = 0;
if(semop(shmid,&sop,1)<0)
{
perror("semop");
return -1;
}
}
//断开映射,直接丢shmddr
//shmat(shmaddr);
system("ipcs -m");
return 0;
}