简述进程间通信方式

     进程间通信方式通常有共享内存 信号量 消息队列 管道 FIFO Socket等几种。  

     共享内存的模型,它是最有效率的进程间通信方式
     进程间信号量是进程间同步主要方式,信号量操作为负的时候,进程阻塞。直到信号量为正   
     内存映射是一种特殊的共享内存方式,只是本质上是对文件的操作
     管道是亲戚进程间通信的常用方式,常用于输入输出重定向   
     Fifo也成为命名管道,可用于无关联进程之间
     Socket是唯一一个不同主机间进程通信的方式
下面简单介绍一下他们的特点与功能

              共享内存(分配 绑定 脱离 释放)

1:效率高,特别是大数据量通信

2:各进程需要协调共同的键值,需要提供额外机制防止竞争条件

3:异步通信

4:和信号量一同使用

                   内存映射(多进程共享文件进行通信的机制)

                   1:分配内存

                   2:读入文件内容至内存

                   3:内存的内容回写到文件

              信号量

1:线程信号量:同步多线程环境的计数器。

2:进程间同步的信号量: System V信号量,操作和sharedmemory类似。

              消息队列

1打开或创建消息队列

2读写操作

3获得或设置队列属性

              管道

1:单向信息的传递设备

2:用于进程的线程之间或者是父子进程之间通信

3:自动同步进程(管道的容量是有限的当管道写满的时候,写入端自动阻塞管道容量4096字节)

 

              FIFO

1:在文件系统中是一个有名字的管道

2:任何进程都可以打开

3:进程间无需关联

 

              SocketSocket

1:是一种双向通信设备

2:同一主机不同进程间通信

3:不同主机间的通信

    以下是一些程序,帮助大家理解

 共享内存

#include"stdio.h"

      #include"sys/shm.h"

      #include"string.h"

      #include"fcntl.h"

      #include"sys/stat.h"

      int main()

      {

          pid_t pid;

          int share_id;

          share_id=shmget(IPC_PRIVATE,getpagesize(),IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR );

          pid=fork();

          if(pid==0)

          {

               char *share1=NULL;

               share1=(char*) shmat (share_id, 0,0);

               memset(share1,0,getpagesize());

               strcpy(share1,"hello,everyone\n");

               shmdt(share1);

          }

          else if(pid>0)

          {

                char *share2=NULL;

                share2=(char*) shmat(share_id,0,0);

                printf("read characters from memory!\n");

                printf("%s\n",share2);

                shmdt(share2);

                shmctl(share_id,IPC_RMID,0);

          }

           return 1;

      }

信号量

     #include <sys/types.h>

     #include <sys/ipc.h>

     #include <sys/sem.h>

     #include<stdio.h>

     #include<sys/stat.h>

     #include<fcntl.h>

     #include<unistd.h>

     #define MAX 3

     union semun

    {

        int val;

        struct semid_ds *buf;

        unsigned short int *array;

        struct seminfo *_buf;

    };

    int sig_alloc(key_t key, int sem_flags)

    {

        return semget (key, MAX, sem_flags);

    }

 

    int sig_destory (int semid,int numth)

    {

        union semun ignored_argument;

        return semctl (semid, numth, IPC_RMID,ignored_argument);

    }

/*

        parray is a set of initialized value

*/

    int sig_init (int semid,int *parray)

   {

        union semun argument;

        int i=0;

        for(i=0;i<MAX;i++)

        {

        //      values[i] = *(parray+i);  

                argument.array = parray;

                semctl (semid, i, SETALL, argument);

        }

   }

   int sig_wait(int semid,int numth)

   {

        struct sembuf operations[MAX];

        operations[numth-1].sem_num = numth-1;

        operations[numth-1].sem_op = -1;

        operations[numth-1].sem_flg = SEM_UNDO;

        return semop(semid,operations,1);

   }

 

 int sig_post(int semid,int numth)

   {

        struct sembuf operations[MAX];

        operations[numth-1].sem_num = numth-1;

        operations[numth-1].sem_op = 1;

        operations[numth-1].sem_flg = SEM_UNDO;

        return semop(semid,operations,1);

   }

int main()

   {

        pid_t pid;

        int sig_id,i=0;

        int sig_val[MAX]={1,0,0};

        sig_id=sig_alloc(0,IPC_CREAT);

        sig_init(sig_id,sig_val);

        pid=fork();

        if(pid==0)

        {

                while(++i<10)

                {

                        sig_wait(sig_id,3);

                        printf("*************** \n");

                        sig_post(sig_id,3);

                }

        }

else if(pid)

        {

                i=0;

                while(++i<10)

                {

                        sig_wait(sig_id,1);

                        printf("++++++++++++++++\n");

                        sig_post(sig_id,1);

                }

 

        }

        return 1;

    }

内存映射

#include <sys/mman.h>

#include <sys/types.h>

#include<stdio.h>

#include<string.h>

#include<sys/stat.h>

#include<stdlib.h>

#include<fcntl.h>

#include<unistd.h>

#define FILE_LENGTH 100

int main(int argc,char **argv)

{

        int fd1,fd2;

        char *pfile=NULL;

        char *load=NULL;

        int num;

        if(argc<3)

        {

                printf("please input more file\n");

                return 0;

        }

 

        fd1=open(argv[1],O_RDONLY);

        fd2=open(argv[2],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);

        printf("fd2=%d\n",fd2);

 

        //fd2=open(argv[2],O_WRONLY);

        lseek (fd2, FILE_LENGTH+1, SEEK_SET);

        write (fd2, "", 1);

        lseek (fd2, 0, SEEK_SET);

        printf("num=%d\n",num);

        printf("fd2=%d\n",fd2);

 

        pfile=(char*)mmap(0,FILE_LENGTH,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd2,0);

        read(fd1,pfile,FILE_LENGTH);

        write(fd2,pfile,FILE_LENGTH);

        close(fd2);

        printf("pfile=%d\n",pfile);

        munmap(pfile,FILE_LENGTH);

        close(fd1);

        return 1;

}

  管道

     #include <sys/mman.h>

     #include <sys/types.h>

     #include<stdio.h>

     #include<string.h>

     #include<sys/stat.h>

     #include<stdlib.h>

     #include<fcntl.h>

     #include<unistd.h>

   int main ()

   {

    int fds[2];

    pid_t pid;

    pipe (fds);

    pid = fork ();

    if (pid == (pid_t) 0)

    {

      char str[10000];

      sleep(1);

      close(fds[1]);

      read(fds[0],str,10000);

      printf("%s",str);

      close(fds[0]);

    }

    else if(pid>0)

    {

        FILE*fp;

        char a[80];

        close(fds[0]);

        fp=(fopen("copy1.c","r"));

        if(fp==NULL)

        {

           printf("can not open!!");

           exit(0);

        }

        else

        {

        while(1)

        {

          if(fread(a,80,1,fp)==0) break;

          write(fds[1],a,sizeof(a));

        }

        }

          wait();

          close(fds[1]);

          fclose(fp);

          return 0;

    }

转载于:https://www.cnblogs.com/3ddan/p/3251979.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

辅助的写与数据库交互的XML文件的类

现在企业级WEB应用中与数据库交互的XML文件都是通过插件自动生成的&#xff0c;不过有些时候修改比较老的项目的时候也是需要手动的来做这一动作的&#xff01;如下代码就是一个实现上述的功能的辅助类&#xff0c;在此记录一下以备后用&#xff01; package com.cn.common.uti…

160 - 8 Andrnalin.1

环境&#xff1a; Windows xp sp3 打开&#xff0c;就一个Key输入框&#xff0c;输入&#xff1a;goodname&#xff0c;点OK&#xff0c;弹出一个 不明文字的框&#xff0c;反正肯定不对。 查壳&#xff0c;无壳的vb程序。OD载入&#xff1a; 查找字串&#xff0c;翻到最下…

C++ 虚函数表解析

C 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”&#x…

160 - 9 Andrnalin.2

环境&#xff1a; Windows xp sp3 打开&#xff0c;这次升级了&#xff0c;有个Name和一个Key&#xff0c;输入&#xff1a; Name&#xff1a;goodname Key&#xff1a;12345678 肯定错误。拿到错误信息的字符串 查壳&#xff0c;无壳的VB程序。 直接OD载入&#xff0c;字…

[PALAPALA] 无题 - 外来的和尚会念经

手机, 现代人响当当的必须品, 尤其在移动App流行的大环境之下显得更为重要. 我, 并不是一个重度依赖手机的机粉. 但我对手机的差异化敏感度很高... 安卓手机, 我不喜欢, 因为满大街泛滥&#xff0c;折腾过多... 苹果手机, 我不喜欢, 因为满大街泛滥&#xff0c;bug过多..... 相…

HTTP协议 (四) 缓存

HTTP协议 (四) 缓存 阅读目录 缓存的概念缓存的好处Fiddler可以方便地查看缓存的header如何判断缓存新鲜度通过最后修改时间&#xff0c;判断缓存新鲜度与缓存相关的headerETag浏览器不使用缓存直接使用缓存&#xff0c;不去服务器端验证如何设置IE不使用缓存公有缓存和私有缓存…

160 - 10 Andrénalin.3

环境&#xff1a; Windows xp sp3 打开&#xff0c;是只有一个key&#xff0c;输入个goodname试试&#xff0c;错误。。。记下错误信息 查壳&#xff0c;无壳的VB程序。 查找字符串&#xff1a; 00402036 UNICODE "kXy^rO|*yXo*m\kMuOn*" 00402090 UNICODE &qu…

160 - 11 Andrnalin.4

环境&#xff1a; Windows xp sp3 打开&#xff0c;这次的界面炫酷多了&#xff0c;就像输保险箱密码。 旁边一个“UNREGISTRIERT”表示还没注册 输入个666666&#xff0c;没反应又没有确认按钮&#xff0c;可以猜测是用timer来检测输入的正确性 查壳&#xff0c;无壳的VB程…

ZooKeeper启动过程2:FastLeaderElection

前一篇文章中说到&#xff0c;启动ZooKeeper集群时&#xff0c;需要分别启动集群中的各个节点&#xff0c;各节点以QuorumPeer的形式启动&#xff0c;最后到达startLeaderElection和lookForLeader。 先说startLeaderElection 首先&#xff0c;初始化节点自身的currentVote【当前…

C++编程调试秘笈(第1次阅读)

阅读时间&#xff1a; 2017-4-17 --- 2017-4-19 第一次阅读《C编程调试秘笈》&#xff0c;可能是因为对项目开发的经验不足&#xff08;最近只是在做简单的五子棋&#xff09;&#xff0c;使得对里面很多的知识点了解得不是很深。 《C编程调试秘笈》讲的内容个人觉得与调试的技…

Web Component 文章

周末无意中了解了Web Component的概念。 http://blog.amowu.com/2013/06/web-components.html http://www.v2ex.com/t/69389 http://www.infoq.com/cn/news/2013/06/webcomponents Shadow DOM http://www.toobug.net/article/what_is_shadow_dom.html http://www.html5rocks.co…

遮罩效果 css3

CSS3提供了遮罩效果&#xff0c;这是以前CSS2中比较难实现的一个新特性&#xff0c;配合SVG或者canvas同样也可以实现遮罩效果&#xff0c;他的效果就如下图所示: 简单的说就是在一个层上面加一个过滤层&#xff0c;过滤层透明度越低&#xff0c;底层就显示的越多&#xff0c;反…

调试九法(第1次阅读)

阅读时间&#xff1a; 2017年4月19日 --- 2017年4月22日 第一次看到这本书的时候&#xff0c;是在网上看到它被评论得十分优秀&#xff0c;只要掌握了书中的方法&#xff0c;就能找到所有的BUG。我就是这样被吸引过来的。 因为是调试9法&#xff0c;所以总共讲了调试的时候注意…

Oracle11g密码区分大小写导致database link无法连接

Oracle11g的密码默认是区分大小写的&#xff0c;该特性通过初始化参数sec_case_sensitive_logon控制&#xff0c;默认TRUE表示区分大小写。但是Oracle11g之前的版本密码都是不区分大小写的&#xff0c;所以在Oracle10g等以前版本创建到Oracle11g的database link时&#xff0c;可…

OC-深浅复制

【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝&#xff0c;浅拷贝就是只拷贝对象&#xff0c;但是属性不拷贝&#xff0c;拷贝出来的对象和原来的对象共用属性&#xff0c;即指向同一个属性地址。深拷贝则相当于不仅拷贝了一个…

计算机科学导论(第一次阅读)

时间&#xff1a; 2017年4月22日----2017年4月26 这是一本计算机入门书籍&#xff0c;粗略地描述了计算机各个方面的内容。当然对于一些十分复杂的知识&#xff0c;也仅仅是大概描述了这方面知识的一些了解知识。

配置SQLServer,允许远程连接

需要别人远程你的数据库&#xff0c;首先需要的是在一个局域网内&#xff0c;或者连接的是同一个路由器&#xff0c;接下来就是具体步骤&#xff1a; &#xff08;一&#xff09;首先是要检查SQLServer数据库服务器中是否允许远程链接。其具体操作为&#xff1a; &#xff08;1…

弹出打开/保存文件对话框 选择文件夹对话框

打开/保存文件对话框: CFileDialog::CFileDialog(BOOL bOpenFileDialog, //为TRUE则显示打开对话框&#xff0c;为FALSE则显示保存对话文件对话框LPCTSTR lpszDefExt NULL, //默认的文件扩展名LPCTSTR lpszFileName NULL, //默认的文件名DWORD dwFlags OFN_HIDEREADONLY | O…

SharePoint 2013的100个新功能之网站管理(一)

一&#xff1a;设置盘 网站操作现在被替换为新的&#xff08;设置&#xff09;盘子。一些新的操作像添加一个应用、添加一个页面或设计管理器被添加而像创建网站则从菜单中移除了。 二&#xff1a;移除以其他用户身份登录 在SharePoint 2013中&#xff0c;从用户欢迎菜单中移除…

160 - 13 badboy

偷懒了很久也是时候要继续开始学习了。 环境&#xff1a; windows xp sp3 工具&#xff1a; VB Decompiler v8.3 这次是个vb文件&#xff0c;所以尝试一下用这个的感觉。 打开文件之后发现有两个CrackMe选择&#xff0c;分别是1.0版本和2.0版本。 打开vb decompiler&#…