码迷,mamicode.com
首页 > 系统相关 > 详细

撸代码--linux进程通信(基于共享内存)

时间:2015-07-12 17:28:45      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:linux   通信   

1.实现亲缘关系进程的通信,父写子读


思路分析:1)首先我们需要创建一个共享内存。

                   2)父子进程的创建要用到fork函数。fork函数创建后,两个进程分别独立的运行。

                   3)父进程完成写的内容。同时要保证子进程退出后,在删除共享内存。

                   4)子进程完成读的内容。

              

效果展示: 

技术分享

              技术分享技术分享

技术分享


代码展示:

         

 #include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

int main()
{//父子进程 操作共享内存
//先创建共享内存  父进程对共享内存写 子进程对共享内存读
        int flag;
        flag=shmget(IPC_PRIVATE,4096,0600|IPC_CREAT);
        //创建一个共享内存  然后返回标示符

        char buf[]={"I am your father\n"};
        char s[123];
        if(fork()!=0)
        {//父进程完成对共享内存的写
           char *f;
           f=(char *)shmat(flag,NULL,0);//连接了父进程和共享内存 返回指针 指向
           //内存的第一个字节
           memset(f,'\0',4096);//这时候可以操作f
           strncpy(f,"I am you father",16);//写入内容

           printf("parent %d Write buf is %s\n",getpid(),f);
           wait(NULL);//等待子进程
           shmctl(flag,IPC_RMID,0);//删除共享 内存
           exit(0);
        }
        else
        {
           char *fp;
           sleep(3);//让父进程有时间往里面写
           fp=(char *)shmat(flag,NULL,0);//子进程跟其连接 然后返回给字符指针
           printf("child pid is %d,Read buf is %s\n",getpid(),fp);
           exit(0);
        }
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.实现非亲缘关系的通信。(两个进程对共享内存的值进行修改)


思路分析:1)首先我们需要创建一个共享内存。

                   2)两个进程要采取锁的方式访问共享内存的值。

       


效果展示:



技术分享


技术分享




代码展示:            

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

//写进程不断的写 然后要判断当前内存中的锁是开闭状态
struct t
{
        int user_now;//定义一个锁
        int val;
};

int main()
{
        int flag;
        flag=shmget((key_t)1234,4096,0600|IPC_CREAT);

        struct t *tt;
        tt=(struct t*)shmat(flag,NULL,0);//拿到内存
        tt->user_now=0;
        while(1)
        {
          if(tt->user_now==0)
                {//如果0 锁开了 那么设置值
                 tt->val=1;
                 printf("I am write, the value is %d\n",tt->val);                                        tt->user_now=1;//加上锁。
                }
         sleep(1);
        }
        shmdt((void *)tt);
        return 0;

}
写进程2:
<pre name="code" class="objc">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

//写进程不断的写 然后要判断当前内存中的锁是开闭状态
struct t
{
        int user_now;//定义一个锁
        int val;
};

int main()
{
        int flag;
        flag=shmget((key_t)1234,4096,0600|IPC_CREAT);

        struct t *tt;
        tt=(struct t*)shmat(flag,NULL,0);//拿到内存
        tt->user_now=0;
        while(1)
        {
          if(tt->user_now==1)
                {//如果0 锁开了 那么设置
                 tt->val=2;
                 printf("I am write2, the value is %d\n",tt->val);                               tt->user_now=0;//加上锁。
                }
          sleep(1);
        }
        shmdt((void *)tt);
        shmctl(flag,IPC_RMID,0);
        return 0;

}




-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3.程序间的对话(AB进程可以实现对话  只可以实现A进程不断写 B进程不断读)

思路分析:1)首先我们需要创建一个共享内存。

                   2)建立两个进程,A,B。 A进程完成接受键盘的输入,然后放在共享内存中。

                   3)B进程拿出共享内存的数据,然后显示出来。

效果展示:   

技术分享                 技术分享

技术分享

代码展示:

A进程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

//写进程不断的写 然后要判断当前内存中的锁是开闭状态
struct t
{
        int user_now;//定义一个锁
        char buf[1024];
};

int main()
{
        int flag;
        flag=shmget((key_t)1234,4096,0600|IPC_CREAT);

        struct t *tt;
        tt=(struct t*)shmat(flag,NULL,0);//拿到内存
        tt->user_now=0;
        while(1)
        {
          if(tt->user_now==0)
                {//如果0 锁开了 那么设置值
                 read(STDIN_FILENO,tt->buf,1024);
                 //将键盘输入的放在共享内存的buf中
                 tt->user_now=1;
                }
        // memset(tt->buf,0,sizeof(tt->buf));
         sleep(1);
        }
        shmdt((void *)tt);
        return 0;

}<strong>
</strong>

B进程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

//写进程不断的写 然后要判断当前内存中的锁是开闭状态
struct t
{
        int user_now;//定义一个锁
        char buf[1024];
};

int main()
{
        int flag;
        flag=shmget((key_t)1234,4096,0600|IPC_CREAT);

        struct t *tt;
        tt=(struct t*)shmat(flag,NULL,0);//拿到内存
        tt->user_now=0;
        while(1)
        {
          if(tt->user_now==1)
                {//如果0 锁开了 那么设置值
                 write(STDOUT_FILENO,tt->buf,strlen(tt->buf));
                 memset(tt->buf,0,sizeof(tt->buf));
                 tt->user_now=0;
                }
          sleep(1);
        }
        shmdt((void *)tt);
        shmctl(flag,IPC_RMID,0);
        return 0;

}





版权声明:本文为博主原创文章,未经博主允许不得转载。

撸代码--linux进程通信(基于共享内存)

标签:linux   通信   

原文地址:http://blog.csdn.net/bao2516090/article/details/46850411

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!