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

wordpress 双语站点河南整站百度快照优化

wordpress 双语站点,河南整站百度快照优化,医院网站,怎么建立局域网网站关于进程间的通信 Linux进程间通信(Inter-Process Communication,IPC)是指在多个进程之间传输数据或信号的一些方法。由于Linux中的进程有各自独立的地址空间,因此它们不能直接访问对方的内存。为了实现进程间的通信,…

关于进程间的通信

Linux进程间通信(Inter-Process Communication,IPC)是指在多个进程之间传输数据或信号的一些方法。由于Linux中的进程有各自独立的地址空间,因此它们不能直接访问对方的内存。为了实现进程间的通信,Linux提供了多种机制:管道,信号,消息队列,共享内存,网络

Linux下的进程通信手段基本上是从Unix平台上继承而来的

进程间通讯分为单个计算机的进程间通讯和局域网的进程间通讯

管道

管道简介:

管道是一种最基本的IPC机制,它允许一个进程的输出成为另一个进程的输入。管道是半双工的,数据只能向一个方向流动

管道的本质:是操作系统内核提供的一种进程间通信机制,它通过内核缓冲区和文件描述符来实现进程间的数据交换和同步

管道分为无名管道与有名管道

一.无名管道

无名管道的特点:

无名管道只能实现单向通信,数据只能从一端流向另一端

无名管道通常用于父子进程之间的通信,因为它们需要在创建时就确定通信的两端

无名管道没有名字,它们在文件系统中不可见,仅在创建它们的进程及其子进程的生命周期内存在。

无名管道将读端与写端抽象成两个文件进行操作,在无名管道创建成功之后,则会返回将读端与写端的文件描述符存入数组

创建无名管道

pipe()函数

函数描述:pipe()创建了一个管道,这是一种单向数据通道,可用于进程间通信。数组 pipefd 用于返回指向管道两端的两个文件描述符。pipefd[0]`指向管道的读端,pipefd[1] 指向管道的写端。写入管道写端的数据将由内核缓冲,直到从管道读端读取。

函数头文件
#include <unistd.h>   功能
管道创建之后,内核会将文件描述符存储到数组    函数原型
int pipe(int pipefd[2]);函数参数
pipefd:用于存储无名管道读端与写端的文件描述符的数组
pipefd[0]:读端文件描述符
pipefd[1]:写端文件描述符    函数返回值:
成功:0
失败:-1,设置 errno,同时将pipefd保持不变

 示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>int main()
{int pipefd[2];int num=pipe(pipefd);if(num == -1){perror("pipe\n");exit(EXIT_FAILURE);}pid_t pid = fork(); // 创建子进程if (pid == -1){perror("fork failed");return 1;}else if (pid == 0){close(pipefd[1]);char buffer[64];size_t rbytes = read(pipefd[0],buffer,sizeof(buffer));if(rbytes == -1){perror("read fail\n");close(pipefd[0]);}else{printf("read : %s\n",buffer);close(pipefd[0]);}}else{close(pipefd[0]);char buf[128]={0};printf("please to input information\n");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';size_t wbytes = write(pipefd[1],buf,sizeof(buf));if(wbytes==-1){perror("write fail\n");close(pipefd[1]);}else{printf("wbytes = %ld\n",wbytes);close(pipefd[1]);}}waitpid(-1,NULL,0);return 0;
}

 代码解读:

使用pipe函数创建一个无名管道,并将文件描述符数组pipefd的两个元素分别设置为管道的读端和写端。如果创建失败,打印错误信息并退出

调用fork函数创建子进程。如果fork失败,打印错误信息并返回1。

如果pid为0,说明当前是子进程。关闭管道的写端文件描述符。

定义一个字符数组buffer,用于存储从管道读取的数据。

从管道的读端读取数据到buffer。如果读取失败,打印错误信息并关闭读端文件描述符。如果读取成功,打印读取的内容并关闭读端文件描述符。

如果pid不为0,说明当前是父进程。关闭管道的读端文件描述符。

定义一个字符数组buf,用于存储用户输入的数据。

将用户输入的数据写入管道的写端。如果写入失败,打印错误信息并关闭写端文件描述符。如果写入成功,打印写入的字节数并关闭写端文件描述符。

调用waitpid函数等待子进程结束。-1表示等待任意子进程,NULL表示不需要子进程的终止状态,0表示不设置任何选项。

二.有名管道

有名管道的特点:

有名管道在文件系统中以文件的形式存在,但不占用磁盘空间,即使创建它的进程已经退出,有名管道仍然存在,直到被显式删除。

有名管道允许任何知道管道名称的进程进行通信

有名管道提供了一种同步机制,写入操作在管道有足够空间时才会成功,读取操作在管道中有数据时才会成功

创建有名管道

mkfifo命令

mkfifo [选项]... 名字
  • -m 或 --mode=模式:设置创建的有名管道的权限。如果不设置,将使用默认的权限(通常是 0666,即允许所有用户读写)。
  • -p 或 --fifo=路径:指定有名管道的路径。如果路径不存在,mkfifo 会创建它。

mkfifo()系统调用

函数描述:

mkfifo()创建一个名为pathname的FIFO特殊文件。mode指定FIFO的权限。它由进程的umask以通常的方式修改:创建的文件的权限是(mode & ~umask)。

FIFO特殊文件类似于管道,只是其创建方式不同。通过调用mkfifo()将FIFO特殊文件输入到文件系统中,而不是作为匿名通信通道。

一旦你以这种方式创建了一个FIFO特殊文件,任何进程都可以打开它进行读写,就像普通文件一样。但是,在您可以对其进行任何输入或输出操作之前,它必须同时在两端打开。为读打开FIFO通常会阻塞,直到其他进程为写打开相同的FIFO,反之亦然。

函数头文件
#include <sys/types.h>
#include <sys/stat.h>函数原型:
int mkfifo(const char *pathname, mode_t mode);函数参数:
pathname:有名管道路径名
mode:有名管道文件访问权限, 常用0644函数返回值:
成功:返回0
失败:返回-1,并设置errno

示例代码:

进程A:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PATH "/home/linux/namepipe"
int main()
{int fr = open(PATH,O_RDONLY);if(fr==-1){perror("open fail");exit(EXIT_FAILURE);}char buffer[128];ssize_t rbytes = read(fr,buffer,sizeof(buffer));if(rbytes==-1){perror("read fail");close(fr);exit(EXIT_FAILURE);}printf("rbytes=%ld buffer=%s\n",rbytes,buffer);close(fr);return 0;
}

进程B:

#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>#define PATH_NAME  "/home/linux/npipe"
int main()
{int result = access(PATH_NAME,F_OK);if(result == -1){int ret = mkfifo(PATH_NAME,0666);if(ret==-1){perror("mkfifo:");exit(EXIT_FAILURE);}}int fw = open(PATH_NAME,O_WRONLY);if(fw==-1){perror("open:");exit(EXIT_FAILURE);}char buf[128]={0};printf("please to enter\n");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';ssize_t wbytes = write(fw,buf,sizeof(buf));if(wbytes==-1){perror("write:");close(fw);exit(EXIT_FAILURE);}printf("wbytes=%ld buf=%s\n",wbytes,buf);close(fw);return 0;
}

代码解读:

进程B:

用于从有名管道(FIFO)中写入数据

定义有名管道的路径宏PATH_NAME

使用access函数检查有名管道是否存在。F_OKaccess函数的参数,用于检查文件是否存在。

如果有名管道不存在,使用mkfifo函数创建它。如果创建失败,使用perror打印错误信息,然后退出程序。

以只写模式(O_WRONLY)打开有名管道。如果打开失败,使用perror打印错误信息,然后退出程序。

定义一个字符数组buf,用于存储用户输入的数据。

使用fgets函数从标准输入读取一行数据到buffgets会读取直到换行符或缓冲区满,但不包括换行符。

buf数组中的最后一个字符(换行符)替换为字符串结束符\0

 使用write函数将用户输入的数据写入有名管道。如果写入失败,使用perror打印错误信息,关闭文件描述符fw,然后退出程序。

关闭文件描述符fw

进程A:

用于从有名管道(FIFO)中读取数据

使用open函数以只读模式(O_RDONLY)打开有名管道。如果打开失败,open函数返回-1。

如果open函数失败,使用perror打印错误信息,然后退出程序。

定义一个字符数组buffer,用于存储从有名管道读取的数据。

使用read函数从有名管道中读取数据到buffer。如果读取失败,read函数返回-1。

如果read函数失败,使用perror打印错误信息,关闭文件描述符fr,然后退出程序。

关闭文件描述符fr

结语:

无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力

http://www.yidumall.com/news/71086.html

相关文章:

  • 新浪网站怎么做推广域名注册网站
  • 网站建设与维护seo推广计划
  • 山东建设科技产品推广网站什么推广方式能快速引流
  • 目前做美术的网站以及app站长工具排名分析
  • 合肥中科大网站开发市场营销推广策划方案
  • 做淘宝一样的网站有哪些成都网站建设技术支持
  • 台州网站设计哪家好可以免费发帖的网站
  • 外国高端网站seo排名优化收费
  • 娄底网站建设方案电商网站模板
  • 上海企业网站备案成都高新seo
  • 南宁市住房和城乡建设部网站种子搜索神器下载
  • 15个html5手机网站模板爱战网关键词查询网站
  • 网站开发 wenzhou品牌广告策划方案
  • 网页设计网站开发百度广告投放平台官网
  • 网站做电商资质吗seo教程百度网盘
  • 做微课常用的网站有哪些今日国际新闻头条15条
  • 智慧团建网站登录操作开发网站的流程是
  • 南昌seo站外优化如何给企业做网络推广
  • 温州h5建站以服务营销出名的企业
  • 推动政务网站建设百度快照是干嘛的
  • 川菜餐馆网站建设模板美食餐厅企业建站php源码程序aso优化前景
  • 下载室内设计排版模板网站有哪些疫情死亡最新数据消息
  • 网站上seo怎么做百度如何购买关键词
  • 盐城中小企业网络推广网站优化关键词价格
  • 上海法资企业名录百度推广优化技巧
  • 东莞网站建设dgtenma国内新闻最新5条
  • 宝山企业做网站佛山网站建设十年乐云seo
  • 网站推广和精准seo域名注册服务网站
  • 数据需求 网站建设大数据技术主要学什么
  • 郑州外贸网站建设公司价格免费网页在线客服系统代码