当前位置: 首页 > news >正文

郴州市住房和城乡建设局网站网站开发价格评估

郴州市住房和城乡建设局网站,网站开发价格评估,数据库设计工具,济南个人网站建设进程间的通信——IPC 进程间通信 (IPC,InterProcess Communication) 是指在不同进程之间传播或交换信息。 IPC的方式通常有管道 (包括无名管道和命名管道) 、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 …

进程间的通信——IPC

进程间通信 (IPC,InterProcess Communication) 是指在不同进程之间传播或交换信息

IPC的方式通常有管道 (包括无名管道和命名管道)消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC

单机:若是在单一机器上,则为单机通信

半双工管道
全双工管道
消息队列
信号量
共享内存

多机:多台机器上,为网络通信

网络通信种类如下:

管道

管道,通常指无名管道(之所以叫无名管道是因为没有文件名),是 UNIX 系统IPC最古老的形式。

特点

(1)它是半双工的(即数据只能在一个方向上流动)具有固定的读端和写端
(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
(3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中
(4)管道中不储存数据,数据写进后读取就会消失,类似于水流。

原型

#include <unistd.h>     //函数pipe包含的头文件
int pipe(int fd[2]);    // 返回值:若成功返回0,失败返回-1

当一个管道建立时,它会创建两个文件描述符: fd[0]为读而打开,fd[1]为写而打开。如下图:

要关闭管道只需将文件描述符关闭即可。

close(fd[0]);
close(fd[1]);

创建

单个进程中的管道几乎没有任何用处。所以,通常调用 pipe 的进程接着调用 fork,这样就创建了父进程与子进程之间的 IPC 半双工通道。如下图所示:

左图为调用fork函数创建了IPC半双工管道,右图为父进程到子进程的管道。

代码示例

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{int pid=0;int fd[2];char buf[128];if(pipe(fd) == -1)//如果管道创建失败{printf("creat pipe failed\n");}pid=fork();if(pid<0)//创建子进程失败{printf("creat failed\n");}else if(pid >0)//进入父进程{printf("this is father\n");close(fd[0]);//关闭读文件描述符write(fd[1],"read from father",strlen("read from father"));//将内容写入管道中wait();//等待子进程}else//进入子进程{printf("this is child\n");close(fd[1]);//关闭写文件描述符read(fd[0],buf,128);//将管道中内容读取到bufprintf("read form father:%s\n",buf);exit(0);//子进程退出}return 0;
}

以上代码实现了管道通信,但read在没有读取到内容时会阻塞,直到读取内容后才正常运行,可以做以下调试:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{int pid=0;int fd[2];char buf[128];if(pipe(fd) == -1)//如果管道创建失败{printf("creat pipe failed\n");}pid=fork();if(pid<0)//创建子进程失败{printf("creat failed\n");}else if(pid >0)//进入父进程{sleep(3);//进入父进程后睡眠3秒再运行printf("this is father\n");close(fd[0]);//关闭读文件描述符write(fd[1],"read from father",strlen("read from father"));//将内容写入管道中wait();//等待子进程}else//进入子进程{printf("this is child\n");close(fd[1]);//关闭写文件描述符read(fd[0],buf,128);//将管道中内容读取到bufprintf("read form father:%s\n",buf);exit(0);//子进程退出}return 0;
}

方案是创建父进程后让其睡眠3秒后再执行父进程中的代码,可见在睡眠时子进程先运行其代码,但并没有执行read函数,此时表现为堵塞状态,直到3秒后父进程正常运行并将内容写入管道中,子进程才读取管道中的内容并成功打印。

FIFO

FIFO,也称为命名管道,它是一种文件类型。

特点

1.FIFO可以在无关的进程之间交换数据,与无名管道不同。
2.FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

原型

#include <sys/stat.h>
int mkfifo (const char *pathname, mode t mode) ;// 返回值: 成功返回0,出错返回-1

第一部分参数是文件的路径,第二部分的 mode 参数与open函数中的 mode 相同。一旦创建了一个 FIFO,就可以用一般的文件1/0函数操作它。如:open、read、write等函数。

当 open 一个FIFO时,是否设置非阻塞标志 (O_NONBLOCK) 的区别:

  • 若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。类似的,只写 open 要阻塞到某个其他进程为读而打开它
  • 若指定了O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 。如果没有进程已经为读而打开该 FIFO,其errno置ENXIO

创建

FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据,并且“先进先出”。

代码示例

read.c

#include <stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>
#include <fcntl.h>int main()
{int fd = 0;int n_read = 0;char buf[128];if(mkfifo("./file",0600) == -1 && errno!=EEXIST)//判断管道出错原因是不是在于已经创建{printf("mkfifo failure\n");perror("why");}else{if(errno==EEXIST)//管道已经创建{printf("file eexist\n");}else//管道未创建{printf("mkfifo successed\n");}}fd = open("./file",O_RDONLY);//只写方式打开printf("open file succeed\n");n_read = read(fd,buf,128);//需要等待写入完毕才能读取,才能执行下列代码printf("read %d byte from file,context is %s\n",n_read,buf);close(fd);return 0;
}

write.c

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>
#include <fcntl.h>int main()
{char *buf="hello word!!!!!!!!!!";int fd;fd = open("./file",O_WRONLY);//只写方式打开printf("write file success\n");write(fd,buf,strlen(buf));//将字符串内容写入fd中,写完才可以读取close(fd);return 0;
}

可见执行read文件时,显示管道已经存在后停止执行后续代码,当执行write文件后read文件继续执行后续代码,实现管道间的通信。

http://www.yayakq.cn/news/392664/

相关文章:

  • 郑州地区网站建设公司能做视频的软件有哪些
  • 微信公众号影视网站怎么做做一个卖车的网站该怎么做
  • 我想花钱做网站企业专属空间登录
  • 建站节深圳网站建设最专业
  • 广东专业企业网站建设怎么建立微信网站
  • Ui互联网门户网站建设西安建网站价格低
  • 网站制作完工验收单网站模板系统
  • 做网页兼职网站手机端网站加盟
  • 做网站备案实名需要钱吗专业网页制作手机页面
  • 同安建设局网站网络营销是什么样的工作
  • 城阳城市规划建设局网站太湖度假区建设局网站
  • 中国建设银行官方网站悦生活php抽奖网站源码
  • 邢台企业做网站报价网站整套模板psd
  • 手机能进封禁网站的浏览器广州番禺电缆集团有限公司
  • 国外空间做网站怎么样有什么功能
  • 做招商的网络营销推广广东seo价格是多少钱
  • 药品网站网络营销推广怎么做有域名之后怎么自己做网站
  • 网站建设试卷摄影网站版权符号
  • 自己怎么做网站赚钱建设公司起名
  • 网站开放培训wordpress同步微博
  • 二级网站有什么好处dw网站怎么做背景图
  • 网页设计与制作教程 pdf下载seo实战培训seo8
  • 成都高新网站建设赣州市微程网络科技有限公司
  • 北京做网站比较好的公司招标代理公司
  • 德山经济开发区建设局网站深圳软件有限公司
  • 海外搜索引擎网站建设计算机类十大含金量证书
  • 如何建设一个国际化的网站手机链接网页怎么制作
  • 阿里云无主体新增网站腾宁网络做网站
  • 2017网站设计新闻发稿平台有哪些
  • 天津网站设计制作公司潍坊市建设银行坊子支行网站