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

做网站爬闪网站及移动端建设情况

做网站爬闪,网站及移动端建设情况,设计企业网络方案的五个步骤,网站建站建设的公司一、进程间通信 (一)系统介绍进程间通信 进程间通信(IPC)介绍 小编插入的这篇文章详细介绍了进程间通信的一些内容,大家可以一起学习。 (二)进程间通信的方法 1、管道 2、信号量 3、共享…

一、进程间通信

(一)系统介绍进程间通信

进程间通信(IPC)介绍

小编插入的这篇文章详细介绍了进程间通信的一些内容,大家可以一起学习。

(二)进程间通信的方法

1、管道

2、信号量

3、共享内存

4、消息队列

5、套接字

        接下来的几篇文章,小编就会按照顺序介绍这几种方法(加粗的为重点内容),今天首先要学到的是管道。

二、管道

        关于管道这个词,其实我们在之前有过一点点了解,不知道大家还是否记得。在Linux(四)基础命令2中,| 代表管道,当时是和grep(过滤)搭配使用。今天,我们就正式接触管道这个内容了。

        首先是管道的分类,分为有名管道(命名管道)无名管道。它们的区别有名管道在任意两个进程间通信,无名管道在父子进程之间通信

(一)有名管道

1、创建有名管道   mkfifo

2、打开管道   open()

3、关闭管道   close()

4、读数据   read()

5、写入数据   write()

        在学习完上面的操作后,我们来思考一个问题:如果进程a要从键盘获取数据传递给另一个进程b,不使用管道操作应该如何完成?

        其实在C语言中,我们可以通过文件操作完成,但是通过文件进行进程间通信存在两个问题:(1)速度慢(2)读数据时不知道a什么时候会写入。

        下面,大家就和小编一起通过有名管道来演示进程间通信。

        管道创建之后,它会在内存上分配一块空间(也就是通过管道的数据存在了内存中),而管道本身在磁盘里,所以管道的大小永远为0

        管道有两端(大家可以想象一下它想一个水管有两头),一端为读端,一端为写端(就像水管一遍流入一遍流出)。即管道一个是读打开,一个是写打开。

        让我们将下面的代码在终端中写入,进行演示。

//a.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>
#include<string.h>int main(){int fd = open("fifo",O_WRONLY);//当前路径可以省略,绝对路径要写全assert(fd!=-1);printf("fd = %d\n",fd);write(fd,"hello",5);close(fd);
}
//b.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>int main(){int fd = open("fifo",O_RDONLY);assert(fd!=-1);printf("fd = %d\n",fd);char buf[128] = {0};read(fd,buf,127);printf("read:%s\n",buf);close(fd);exit(0);
}

我们打开两个终端界面。

        下面我们将上面的代码进行修改,使a循环写入(从键盘写入),b循环读取。

//a.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>
#include<string.h>int main(){int fd = open("fifo",O_WRONLY);//当前路径可以省略,绝对路径要写全assert(fd!=-1);printf("fd = %d\n",fd);while(1){   printf("input:\n");char buff[128] = {0};fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}write(fd,buff,strlen(buff));}   close(fd);
}//b.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>int main(){int fd = open("fifo",O_RDONLY);assert(fd!=-1);printf("fd = %d\n",fd);while(1){char buf[128] = {0};if(read(fd,buf,127)==0)//用于验证管道写端关闭,读read返回值为0(第3个特点){break;}printf("read:%s\n",buf);}   close(fd);exit(0);
}

通过上面这两个个例子,我们来总结一下管道的特点

        (1)管道必须读,写进程同时open,否则会阻塞;

        (2)如果管道没有数据,那么read会阻塞;    

        (3)管道的写端关闭,读read返回值为0;

        (4)管道打开的时候只有只读和只写两种方式,读写方式打开是未定义的。           

(二)无名管道

        有名管道之所以不限制进程,就是因为它有名字可以被找到;而无名管道不可以,如果不限制进程,它又没有名字,我们就没有办法找到它了。因此,无名管道只能用于父子进程间通信。

        创建无名管道   pipe

还是同样的思路,学习一个新的命令要使用帮助手册 man pipe。

//fi.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>
#include<string.h>int main(){int fd[2];assert(pipe(fd)!=-1);pid_t pid = fork();assert(pid!=-1);//先open 后fork 共享文件描述符if(pid==0){   close(fd[1]);char buff[128] = {0};read(fd[0],buff,127);printf("child read:%s\n",buff);close(fd[0]);} else{close(fd[0]);write(fd[1],"hello",5);close(fd[1]);}exit(0);
}

 通过上面两个例子,下面小编带领大家总结一下管道的特点:

        (1)管道必须读,写进程同时open,否则会阻塞;

        (2)如果管道没有数据,那么read会阻塞;

        (3)管道的写端关闭,读read返回值为0;

        (4)管道打开的时候只有只读和只写两种方式,读写方式打开是未定义的;

        (5)无论有名还是无名,写入管道的数据都在内存中(管道的大小永远为0,面试的重点)

        (6)管道是一种半双工通信方式(通信方式有单工,半双工,全双工)

        (7)有名管道和无名管道的区别:有名管道可以在任意进程间使用,无名管道主要在父子进程
间通信

        (8)管道的读端关闭,写会产生异常(发送信号SIGPIPE)

小编通过改变a.c的代码来进行验证,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>
#include<string.h>
#include<signal.h>
void sig_fun(int sig){printf("sig = %d\n",sig);
}
int main(){signal(SIGPIPE,sig_fun);int fd = open("fifo",O_WRONLY);//当前路径可以省略,绝对路径要写全assert(fd!=-1);printf("fd = %d\n",fd);while(1){   printf("input:\n");char buff[128] = {0};fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}write(fd,buff,strlen(buff));}   //write(fd,"hello",5);close(fd);
}

(三)管道的实现

通过上面的图片,我们可以直到管道其实就是一个循环队列。

如果管道是空的,读操作会堵塞;如果管道是满的,写操作会堵塞。


文章转载自:

http://Yt5hvSIF.gyfhk.cn
http://RiViJLXR.gyfhk.cn
http://cLf1UAd9.gyfhk.cn
http://d2Fq5qGN.gyfhk.cn
http://oj76COpQ.gyfhk.cn
http://9PSofcCv.gyfhk.cn
http://yb5N1GJO.gyfhk.cn
http://JaslD31M.gyfhk.cn
http://M4751QS3.gyfhk.cn
http://a7hADhk4.gyfhk.cn
http://9TXNW5q3.gyfhk.cn
http://hGUvbzPo.gyfhk.cn
http://hNrhEaZe.gyfhk.cn
http://XlIIDuwJ.gyfhk.cn
http://KxbNeyAH.gyfhk.cn
http://k7u8dfox.gyfhk.cn
http://VVDPIO4j.gyfhk.cn
http://IIsnxUCp.gyfhk.cn
http://5vcm7VlV.gyfhk.cn
http://UaMZXR5A.gyfhk.cn
http://b0RegkFw.gyfhk.cn
http://HUm4dKNo.gyfhk.cn
http://7dBOIC5u.gyfhk.cn
http://xZWHUTbQ.gyfhk.cn
http://eeochWjE.gyfhk.cn
http://Wkvzvvvn.gyfhk.cn
http://2ceMpmLb.gyfhk.cn
http://pGspvsos.gyfhk.cn
http://XvKztu1u.gyfhk.cn
http://xO0THyCK.gyfhk.cn
http://www.dtcms.com/wzjs/772296.html

相关文章:

  • 济南网站建设92jzh滕州做网站比较好的网络公司
  • 做系统 和网站前端软件项目管理考试题及答案
  • 个人做网站需要什么条件计算机文化基础网页制作题视频
  • 建设彩票网站犯法吗广告公司企业简介怎么写
  • 网站建设卖给别人可以吗制作企业网站需要多少钱
  • 国外html响应式网站模板下载wordpress 最强主题
  • 策划书网站最专业网站建设
  • 创建官方网站网址广告设计与制作专业课程
  • 站外推广网站百度竞价推广什么意思
  • 阜康市建设银行网站山东德州网站建设哪家便宜
  • 长沙网站优化排名网上设计网站
  • 在国外做盗版电影网站吗如何自学网页设计
  • 电子商务网站采用的开发技术做淘客网站要什么样服务器
  • 塘沽做网站比较好的国内wordpress大牛
  • 游戏怎么做充值网站网站被别人做镜像
  • 辽宁省建设厅网站更新采集wordpress文章上传
  • 小狗做爰网站wordpress怎么发长文章
  • 查看网站浏览量口碑好的赣州网站建设
  • 有什么做公众号封面图的网站公司网站做好了怎么做排名
  • 深圳响应式网站建设哪家好公司付网站会员费科目怎么做
  • 电子商务网站建设一般流程做请柬网站
  • h5手机网站开发wordpress可以做外贸
  • 广州我要做网站我的世界做图片的网站
  • 网站建设对于企业的重要性网络公关公司危机公关
  • 网站建设介绍文字网站建设技术保证怎么写
  • 重庆建设部网站官网seo优化找stso88效果好
  • 官网网站备案流程图园林景观设计公司名称
  • 那个网站可免费做推广网站集约化建设题目
  • 功能网站建设多少钱the7 wordpress主题
  • 西安市未央区建设局官方网站做电影网站如何买版权