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

新网络营销外汇seo公司

新网络营销,外汇seo公司,专注江苏网站建设,上海网站商城建设公司吗文章目录 无名管道pipe有名管道 进程之间的通信:Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另外一个进程中都看不到,所以进程之间不能相互访问,要交换数据必须通过…

文章目录

    • 无名管道pipe
    • 有名管道

进程之间的通信:Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另外一个进程中都看不到,所以进程之间不能相互访问,要交换数据必须通过内核。如图,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2在从内核缓冲区中把数据读走,内核提供的这种机制称为进程间通信IPC(InterProcess Communication)

在这里插入图片描述

  • 管道是LInux/Unix最经典的一种通信方式,管道实质上是父子进程借助内存文件的一种通信方式。借助进程映像加载等手段,它可以实现两个程序之间的数据交换。
  • 管道的本质是一块内核缓冲区,由两根文件描述符引用,一个表示读端,一个表示写端,规定数据从管道的写端流入管道,从读端流出。当两根进程都终结的时候,管道会自动消失。默认的,管道的读端和写端都是堵塞的。
  • 管道包括两种:无名管道和有名管道。

无名管道pipe

使用无名管道时,还可以搭配使用close()关闭文件描述符和dup()复制管道文件描述符来实现输入输出标准的重定向。

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>int main(){int data_processed;int file_pipes[2];const char some_data[]="123";char buffer[BUFSIZ+1];memset(buffer,'\0',sizeof(buffer));if(pipe(file_pipes)==0){data_processed=write(file_pipes[1],some_data,strlen(some_data));printf("Wrote %d bytes\n",data_processed);data_processed=read(file_pipes[0],buffer,BUFSIZ);printf("Read %d bytes:%s\n",data_processed,buffer);exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
Wrote 3 bytes
Read 3 bytes:123
[cch@aubin os]$ 
  • menset是c语言的初始化函数,作用是将某一块内存中的内容全部设置为指定的值,这个函数通常为新申请的内存做初始化工作。void *memset(void *s, int ch, size_t n);将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
  • int pipe(int fd[2])用于创建一个管道,如果函数调用成功,fd[0]存放管道的读端,fd[1]存放管道的写端(都是文件描述符),并且返回0,如果失败则返回-1,并设置errno值。

当父进程使用pipe创建管道之后,一般需要再fork一个子进程,然后通过管道实现父子进程之间的通信。一般来说只要两个进程有血缘关系(有共同的祖先),就可以使用管道进行通信。

  • 父进程创建管道
    在这里插入图片描述
  • 父进程fork子进程
    在这里插入图片描述
  • 父进程关闭读端,子进程关闭写端,实现进程之间通信
    在这里插入图片描述
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>int main(){int data_processed;int file_pipes[2];const char some_data[]="123";char buffer[BUFSIZ+1];pid_t fork_result;memset(buffer,'\0',sizeof(buffer));if(pipe(file_pipes)==0){fork_result=fork();if(fork_result==-1){fprintf(stderr,"Fork failure");exit(EXIT_FAILURE);}//子进程if(fork_result==0){data_processed=read(file_pipes[0],buffer,BUFSIZ);printf("son:Read %d bytes:%s\n",data_processed,buffer);exit(EXIT_SUCCESS);}else{data_processed=write(file_pipes[1],some_data,strlen(some_data));printf("father:Wrote %d bytes\n",data_processed);}exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
father:Wrote 3 bytes
son:Read 3 bytes:123
[cch@aubin os]$ 

管道实现程序之间的通信

//pipe4.c
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>int main(int argc,char *argv[]){int data_processed;char buffer[BUFSIZ+1];int file_descriptor;memset(buffer,'\0',sizeof(buffer));sscanf(argv[1],"%d",&file_descriptor);//读取格式化的argv[1]给file_descriptordata_processed=read(file_descriptor,buffer,BUFSIZ);printf("%d-read %d bytes:%s\n",getpid(),data_processed,buffer);exit(EXIT_FAILURE);}
# 0表示键盘,从键盘中读取输入并且输出
[cch@aubin os]$gcc pipe4.c -o pipe
[cch@aubin os]$ ./pipe 0
123466
4947-read 7 bytes:123466[cch@aubin os]$ 
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>int main(){int data_processed;int file_pipes[2];const char some_data[]="123";char buffer[BUFSIZ+1];pid_t fork_result;memset(buffer,'\0',sizeof(buffer));if(pipe(file_pipes)==0){fork_result=fork();if(fork_result==-1){fprintf(stderr,"Fork failure");exit(EXIT_FAILURE);}//子进程if(fork_result==0){sprintf(buffer,"%d",file_pipes[0]);//将file_pipes[0]转换成字符串,以适应execl调用中参数类型的要求,其中fotmat参数与print中的类型一致/*execlp("ls", "ls", "-l", "-F", NULL);         使用程序名在PATH中搜索。execl("/bin/ls", "ls", "-l", "-F", NULL);    使用参数1给出的绝对路径搜索。*/if(execl("pipe","pipe",buffer,(char *)0)==-1)printf("execl error\n");exit(EXIT_FAILURE);}else{data_processed=write(file_pipes[1],some_data,strlen(some_data));printf("father:Wrote %d bytes\n",data_processed);}exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);
}
[cch@aubin os]$ gcc demo.c
[cch@aubin os]$ ./a.out
father:Wrote 3 bytes
argv[1]=3
6098-read 3 bytes:123
[cch@aubin os]$ 

有名管道

有名管道可以实现两个没有血缘关系的进程进行通信。

[cch@aubin s]$ mkfifo pp
[cch@aubin s]$ ls -la
总用量 44
drwxrwxr-x. 2 cch cch    80 117 11:01 .
drwxr-xr-x. 5 cch cch    72 1014 20:04 ..
-rwxrwxr-x. 1 cch cch 14176 1023 19:09 a.out
-rw-r--r--. 1 cch cch 12288 1014 17:17 .cc.c.swp
-rw-------. 1 cch cch 12288 1012 17:05 .file1.c.swp
-rw-rw-r--. 1 cch cch   206 117 11:00 file.c
prw-rw-r--. 1 cch cch     0 117 11:01 pp

可以看到,当使用mkfifo创建有名管道后,管道文件的信息的第一个显示为p,表示其为管道文件

[cch@aubin s]$ echo "hhhhsjiqq">pp

在命令行内输入以上,一开始管道会堵塞,因为它会等待一个进程读取数据

[cch@aubin s]$ cat pp
hhhhsjiqq
[cch@aubin s]$ 
http://www.ds6.com.cn/news/46171.html

相关文章:

  • 公司网站开发方案网站宣传推广策划
  • 公司邮箱怎么注册申请seo关键技术有哪些
  • 企业做网站etp和源程序百度知道问答平台
  • 邢台营销型网站建设国外免费网站域名服务器
  • 大型社区网站开发文档2022年今天新闻联播
  • 潍坊住房公积金官网seo网站优化方案
  • 可信网站认证必需做吧个人网站制作多少钱
  • 如何做淘宝客自己的网站互联网推广运营是干什么的
  • 男女做爰真人视频免费网站北京、广州最新发布
  • 企业网站 域名注册营销推广运营
  • 游戏的制作方法淄博seo网站推广
  • 论坛的网站制作如何seo网站推广
  • 同一个公司可以做几个网站个人seo怎么赚钱
  • 广西钦州网站建设身边的网络营销案例
  • 有api对接文档怎么做网站站长综合查询工具
  • 高端网站建设方案报价网站优化排名公司
  • 日本网站开发前端2020新闻大事件摘抄
  • 沧州营销型网站建设360优化大师官方下载手机
  • 青岛网站建设东橙品牌设计永久免费的建站系统有哪些
  • 医疗网站建设多少钱建网站的公司排名
  • 网站策划书模板大全石家庄关键词优化报价
  • 基于百度地图的网站开发百度竞价登录入口
  • 自己做盗版小说网站吗广东网站营销seo费用
  • 独立ip做网站关键词搜索神器
  • 高端网站设计百家号网络销售面试问题有哪些
  • 网站运营企业杭州推广系统
  • 做淘宝网站运营工作流程广告设计网站
  • 做类似简书的网站百度推广关键词优化
  • 漳州网站建设哪家好sem优化托管公司
  • 自己做网站挣钱不关键词查询工具软件