共享内存 消息队列 信号量集

实现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;
}
                                                                                                      
                                                                                                      
                                                                                                      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值