linux桌面进程怎么通信,FIFO - Linux 进程通信(System V)_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/20 2:06:51/文章来源:https://blog.csdn.net/weixin_39980809/article/details/116608870

一.

一些简单理解:

我们知道管道是没有标志的,所以只能是在同一个进程组中进行通信,不同的祖先产生的进程之间是不可以的!!所以此处引入FIFO机制

同样也只能是单流的!不同的是FIFO是有标志的!每个FIFO都有一个路径名与之相关!

FIFO也称为 “有名管道”

#include

#include

int mkfifo( const char* pathname, mode_t mode );

mode 与 open函数中的一样,默认为:O_CREAT | O_EXCL

if FIFO 已经存在,那么返回EEXIST错误!if不存在那么就是创建新的FIFO。if仅仅是打开FIFO,那么就可以使用open()函数就可以了!

对于一个已经创建好的FIFO来说,只能是读或者写,不能同时进行。( 半双工 )

对于FIFO来说:先进先出,所以从开头读,从尾部写

查看所创建的管道:

ls -lF /tmp/my_fifo

> prwxr-xr-x 1 pt gf 0 2012-01-13 10:43/tmp/my_fifo|

注意:ls命令的输出结果中的第一个字符为p,表示这是一个管道。最后的|符号是由ls命令的-F选项添加的,它也表示是这是一个管道。

二.

#include

#include

#include

#include

int main()

{

intres;

if ( ( res =mkfifo("/tmp/my_fifo", 0777) ) == 0 )       //!> 对于mkfifo来说:成功则返回0,否则返回-1

{                                                 //!>注意全名就是   /tmp/my_fifo 其实就是tmp路径下的 my_fifo 文件

printf("FIFOcreated\n");

}

return0;

//!> exit(EXIT_SUCCESS);

}

三.

1.简介:

两个独立的程序:

1.     生产者程序,它在需要时创建管道,然后尽可能快地向管道中写入数据。

2.     消费者程序,它从FIFO中读取数据并丢弃它们。

2.代码:

#include

#include

#include

#include

#include

#include

#include

#define FIFO_NAME   "/tmp/Linux/my_fifo"            //!> FIFO全名

#define  BUFFER_SIZE 40                              //!> PIPE_BUF,linux 2.6.11 以前,是4096,以后是65536。

#define TEN_MEG     36 * 10                        //!> ( 1024 * 1024 * 10)

int main()

{

intpipe_fd;

intres;

intopen_mode =O_WRONLY;                     //!> 生产者:只是写data就可以了~

int bytes =0;

charbuffer[BUFFER_SIZE + 1] ="abcdefghijklmnopqrstuvwxyz";      //!> 36 个测试字符

if( access(FIFO_NAME, F_OK ) == -1)            //!> if 文件不存在( if 文件存在,那么access返回值是0 )

{

res =mkfifo( FIFO_NAME, 0777);            //!> 文件不存在就创建文件

if( res != 0)                                 //!> 文件创建成功就返回0,否则返回-1,此处就是没有成功的情况

{

fprintf(stderr, "Can't create fifo %s\n", FIFO_NAME );

exit(EXIT_FAILURE );

}

}

printf("Process %d opening  FIFO O_WRONLY \n", getpid());

pipe_fd =open( FIFO_NAME, open_mode);                  //!> 打开创建的文件是只写模式 ( 注意open返回的是文件描述符 )

//!>从此处开始:生产者开始写文件,所以需要启动Device,那么就由“消费者”来执行CPU

printf("Process %d ---> FILE  ID: %d\n",getpid(), pipe_fd );

if( pipe_fd!= -1 )                        //!>对于open来说,成功返回FILE_ID,失败返回-1 ( 此处是成功~ )

{

chartest_char ='0';

while( bytes< TEN_MEG)                             //!> 指定大小为TEN_MEG

{

//!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

test_char++;                  //!> 作为测试字符(标志每次读出来的是不是写入的还是仅仅是开头的数据 )

int len =strlen( buffer);                                //!> 测试字符串处理( 仅仅是测试而已 )

buffer[len]= test_char;

buffer[len+1] = '\0';

//!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

res = write(pipe_fd, buffer, BUFFER_SIZE ); //!> 将数据写到文件中   (注意返回的是一次写入的字节数 )

if( res ==-1 )

{

fprintf(stderr, "Write error on pipe\n" );

exit(EXIT_FAILURE );

}

printf("生产者写入:--->  ");

puts( buffer);

bytes +=res;

}

close(pipe_fd );                                          //!> 关闭文件描述符( 也就是关闭文件s )

}

else

{

exit(EXIT_FAILURE );

}

printf("Process %d   finish... \n",getpid() );

exit( 0);

}

#include

#include

#include

#include

#include

#include

#include

#define  FIFO_NAME   "/tmp/Linux/my_fifo"

//!> 注意消费者需要访问的路径就是“生产者”的写入路径文件(一个写,一个读)

#define  BUFFER_SIZE 40

//!>PIPE_BUF                  //!> PIPE_BUF,linux 2.6.11 以前,是4096,以后是65536。

int main()

{

intpipe_fd;

intres;

intopen_mode =O_RDONLY;                     //!> 消费者只读

int bytes =0;

charbuffer[BUFFER_SIZE + 1];

memset(buffer, '\0', sizeof( buffer ));            //!> 分配给buffer结束字符值而已

printf("Process %d opening FIFO O_RDONLY \n", getpid() );

pipe_fd =open( FIFO_NAME, open_mode);      //!> 打开已有的文件只读

printf("Process %d result %d \n", getpid(), pipe_fd );

if( pipe_fd!= -1 )

{

res = read(pipe_fd, buffer, BUFFER_SIZE);      //!> 读取第一次( 以防没有数据 )

while( res> 0 )

{

bytes +=res;

printf("消费者读出:--->  ");

puts( buffer);

res = read(pipe_fd, buffer, BUFFER_SIZE);   //!>从文件中读取data到buffer中

}

close(pipe_fd );

}

else

{

exit(EXIT_FAILURE );

}

printf("Process %d finished, %d bytes read/n", getpid(),bytes);

exit(EXIT_SUCCESS);

}

3.运行及结果分析:

原理:消费者和生产者共用这个 有名pipe(FIFO),本质相当与是指针而已,

都往后只,取值也往后取值,所以每次取的顺序就是写入的顺序

编译这两个程序:

gcc –o c cons.c

gcc –o p per.c

运行这两个程序:

将生产者程序后台运行

./p&

再运行消费者程序

./c

终端COPY:

pt@ubuntu:~/桌面/net programming/进程通信/FIFO/生产者消费者$ ./p&

[1] 6055

Process 6055 opening  FIFO O_WRONLY

pt@ubuntu:~/桌面/net programming/进程通信/FIFO/生产者消费者$ ./c

Process 6056 opening FIFO O_RDONLY

Process 6056 result 3

Process 6055 ---> FILE  ID: 3

生产者写入:--->  abcdefghijklmnopqrstuvwxyz1                           //!> 说明:生产者的读出就是写入的内容

生产者写入:--->  abcdefghijklmnopqrstuvwxyz12                        //!> 也就是说:指针是跟着走的,并不是普通的文件

消费者读出:---> abcdefghijklmnopqrstuvwxyz1

生产者写入:--->  abcdefghijklmnopqrstuvwxyz123

消费者读出:---> abcdefghijklmnopqrstuvwxyz12

生产者写入:--->  abcdefghijklmnopqrstuvwxyz1234

消费者读出:---> abcdefghijklmnopqrstuvwxyz123

生产者写入:--->  abcdefghijklmnopqrstuvwxyz12345

消费者读出:---> abcdefghijklmnopqrstuvwxyz1234

生产者写入:--->  abcdefghijklmnopqrstuvwxyz123456

消费者读出:---> abcdefghijklmnopqrstuvwxyz12345

生产者写入:--->  abcdefghijklmnopqrstuvwxyz1234567

消费者读出:---> abcdefghijklmnopqrstuvwxyz123456

生产者写入:--->  abcdefghijklmnopqrstuvwxyz12345678

消费者读出:---> abcdefghijklmnopqrstuvwxyz1234567

生产者写入:--->  abcdefghijklmnopqrstuvwxyz123456789

消费者读出:---> abcdefghijklmnopqrstuvwxyz12345678

消费者读出:---> abcdefghijklmnopqrstuvwxyz123456789

Process 6055   finish...

Process 6056 finished, 360 bytes read/n[1]+ Done                   ./p

四.

1.简介

server 要以一个熟知路径创建一个 FIFO 来监听所有的 client 的请求!所以可以是开启读pipe口,关闭写口

对于子进程来说,就是要写入数据就可以了!

但是为了返回server的反馈数据,那么子进程还是需要pipe来接受data fromserver;可以以自己的ID来创建!

2.代码:

#include

#include

#include

#include

#include

#include

#include

#define SERVER_FIFO_NAME   "/tmp/Linux/server_fifo"

#define CLIENT_FIFO_NAME   "/tmp/Linux/client_%d_fifo"

//!>注意对于不同的client需要创建不同的自己的FIFO(可以根据自己唯一的pid来格式化)

#define BUFFER_SIZE            PIPE_BUF

#define MESSAGE_SIZE          20

#define NAME_SIZE                256

typedef structmessage                                    //!> message数据结构

{

pid_tpid;

chardata[MESSAGE_SIZE + 1];

}message;

#include "cs.h"

int main()

{

intserver_fifo_fd;         //!> 打开server FIFO的描述符

intclient_fifo_fd;         //!> 打开client FIFO的描述符

messagemsg;         //!> 接收client的请求 de 信息

char *p;               //!> 此value仅仅是为了简单处理data而已

charclient_fifo_name[NAME_SIZE];                     //!>先获得client的msg,取出client的pid,拼接成client的pid,用于反馈信息

if( (access( SERVER_FIFO_NAME, F_OK ) ) == -1)      //!> if server的FIFO还不存在,就创建FIFO文件

{

if( (mkfifo( SERVER_FIFO_NAME, 0777 ) ) == -1)      //!> 创建server的FIFO

{

printf("Fail  To Create SERVER  FIFO ");

exit(EXIT_FAILURE);                              //!> failure

}

}

server_fifo_fd = open( SERVER_FIFO_NAME, O_RDONLY );

if(server_fifo_fd == -1)                                    //!> fail to open the fifo file

{

printf("Failto open server_fifo_file");

exit(EXIT_FAILURE );

}

sleep(5);

while( (read( server_fifo_fd, &msg, sizeof( msg ) ) )> 0)

//!> exist themsg( 主要是为了获取data加以处理,还有:获取client的pid,来获得反馈的client的FIFO PIPE )

{

//!>注意:此处一定是while不是if,因为有多个客户端,所以需要一个所谓死循环(也就是当最后一个客户都关闭就结束)

p =msg.data;            //!> 指针处理(简单处理数据而已)

while( *p)                //!> 当字符串还没有结束

{

( *p ) =toupper( *p);   //!> 处理成大写字母而已

p++;

}

sprintf(client_fifo_name, CLIENT_FIFO_NAME, msg.pid);         //!> 将数据格式化成client的标准名称

client_fifo_fd = open( client_fifo_name, O_WRONLY );

if(client_fifo_fd == -1)      //!> Fait to open

{

printf("Fait to open client FIFO..." );

exit(EXIT_FAILURE );

}

write(client_fifo_fd, &msg, sizeof( msg ));                     //!> write into client fifo

close(client_fifo_fd);

}

close(server_fifo_fd);

unlink(SERVER_FIFO_NAME);                                    //!> 关闭链接

exit(EXIT_SUCCESS);

}

#include "cs.h"

int main()

{

intserver_fifo_fd;

intclient_fifo_fd;

charclient_fifo_name[NAME_SIZE];

messagemsg;

msg.pid =getpid();

sprintf(client_fifo_name, CLIENT_FIFO_NAME, getpid());      //!> 格式化此client的名称

if( (access( client_fifo_name, F_OK ) ) == -1)               //!>没有此FIFO文件就创建

{

if( (mkfifo( client_fifo_name, 0777 ) ) == -1)               //!> Fail to create client fifo

{

printf("Fail to create client fifo..." );

exit(EXIT_FAILURE );

}

}

server_fifo_fd = open( SERVER_FIFO_NAME, O_WRONLY);   //!> 写入内容

if( server_fifo_fd == -1 )

{

printf("Failto open server fifo...");

exit(EXIT_FAILURE );

}

sprintf( msg.data, "hello from %d...", msg.pid );                     //!> 格式化到msg中等待发送

printf( "%d  send the msg...", getpid() );

write( server_fifo_fd, &msg, sizeof( msg ) );

close( server_fifo_fd);

client_fifo_fd = open( client_fifo_name, O_RDONLY );

if(client_fifo_fd == -1 )

{

printf("Failto open client fifo...");

exit(EXIT_FAILURE );

}

if( ( read(client_fifo_fd, &msg, sizeof( msg ) ) )> 0 )

{

printf("\nClient %d recived msg: ---> %s \n", msg.pid,msg.data );

}

close(client_fifo_fd);

unlink(client_fifo_name);

exit(EXIT_SUCCESS );

}

最后来说:其实本质就是 创建一个文件作为交换区而已!结果也就是创建文件,打开文件,操作文件。。。0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

与虫子尾交3d动画网站_HTML5 3D环形方块翻转动画

插件简介今天给大家带来的这款方块动画是基于HTML5 Canvas的&#xff0c;它的特点是许多个方块围成一个环形&#xff0c;每个方块不停地旋转&#xff0c;同时你也可以拖拽鼠标来看环形方块的不同视角&#xff0c;如果你是在移动设备上观看在线演示&#xff0c;那么你也可以滑动…

Windows下搭建Wordpress博客网站

一&#xff1a;安装wamp Windows下的ApacheMysql/MariaDBPerl/PHP/Python&#xff0c;一组常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大…

nginx服务器没有配置SSL的网站通过https访问时,会跳转访问其他https的网站

引言:测试的时候 突然遇到这个问题 ,度娘了一些解决办法,参考了博文:nginx服务器没有配置SSL的网站通过https访问时,会跳转访问其他https的网站 的解决办法 ,再此记录一下,以便查看 在项目配置文件中:加入如下配置 listen 443;if ($server_port ~ 443){rewrite ^(/.*)$ …

PHP快速入门 如何导入网站模板

1 把前面的Guest网站复制到www目录下 2 在地址栏敲http://localhost:8080/guest/ 进入该网站&#xff0c;发现没有导入数据库 3 新建一个标签&#xff0c;在地址栏输入http://localhost:8080/phpmyadmin/ 用户名为root密码为123456登陆数据库系统并点击Import 4 点击浏览&am…

ant design 分页中文字_手机网站建设中,能够充分提升利用率的一些要点!

在大部分上班族挤地铁或是公交车上下班的图中&#xff0c;也许打开手机浏览一些网页是很多白领获取信息的一个非常重要的方式。为了针对这些用户的需求&#xff0c;也有越来越多的企业开始重视手机网站的建设&#xff0c;因为手机网站如果能够建设得当的话可以给这些人带来非常…

mysql注册表下载_「如何进入注册表」windows 怎样进入注册表删除MySql注册表内容 - seo实验室...

如何进入注册表第一步:打开运行第二步输入&#xff1a;regedit命令第三部在注册表中删除mysql对应的数据HKEY_local_MACHINE\SYSTEM\CurrentControlSet\ServicesHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\ServicesHKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services相关阅读背景…

java家电网站_130-家电类

[java]代码库import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int num scan.nextInt();int sum 0;for( int i 0; i < num; i){int n scan.nextInt();int w scan.nextInt();sum w;}System…

查看网站服务器id,docker怎么查看创建的容器id_网站服务器运行维护,docker

docker容器有几种状态_网站服务器运行维护docker容器从产生到运行部署大致分为三个状态&#xff1a;1、Dockerfile&#xff0c;用于创建image镜像的模板文件&#xff1b;2、Image&#xff0c;镜像文件&#xff1b;3、Container&#xff0c;容器。两种办法查询容器id1、使用dock…

仿写小米网站首页 顶部导航栏部分

说明&#xff1a; 1.由于本人只学习了部分html和css&#xff0c;所以本文没有涉及到js部分。 2.本文并没有实现小米官网首页的全部功能&#xff0c;还存在很多问题。如果以后技能提升&#xff0c;会继续更新实现未完成的功能。 3.这个练习会为分几篇文章介绍从最初分析到最后实…

仿写小米网站首页 产品导航栏

说明&#xff1a; 1.由于本人只学习了部分html和css&#xff0c;所以本文没有涉及到js部分。 2.本文并没有实现小米官网首页的全部功能&#xff0c;还存在很多问题。如果以后技能提升&#xff0c;会继续更新实现未完成的功能。 3.这个练习会为分几篇文章介绍从最初分析到最后实…

仿写小米网站首页 中间部分

说明&#xff1a; 1.由于本人只学习了部分html和css&#xff0c;所以本文没有涉及到js部分。 2.本文并没有实现小米官网首页的全部功能&#xff0c;还存在很多问题。如果以后技能提升&#xff0c;会继续更新实现未完成的功能。 3.这个练习会为分几篇文章介绍从最初分析到最后实…

github网站仓库建立及资料上传

github网站仓库建立及资料上传 1.在https://github.com 网站按照页面提示注册新用户&#xff0c;注册后使用关联邮箱和登录密码登录网站。 2.登录账户新建自己的仓库用于储存资料。 github新建仓库操作步骤如下&#xff1a; 3.github网站上传资料流程详解 4.在Hbulider中运…

织梦系统网站主域名后缀index.html对优化有影响吗,用织梦dedecms做网站的六大SEO优化注意事情...

一个排名好的网站离不开好的cms&#xff0c;当然不同cms各有各的好处&#xff0c;因此我们在上线新网站的时候&#xff0c;要针对不同的情况因地制宜&#xff0c;选择不同的网站管理系统来做SEO优化&#xff0c;现在使用比较流行的cms是织梦dedecms&#xff0c;今天就针对使用该…

win服务器常用维护命令,PowerShell命令大全(图文详解)_网站服务器运行维护,powershell,命令大全,win...

win10电源高性能不见了怎么办_网站服务器运行维护win10电源高性能不见了的解决方法是&#xff1a;1、打开控制面板&#xff0c;进入电源选项&#xff1b;2、点击【创建电源计划】选项&#xff1b;3、勾选【高性能】选项&#xff0c;点击【下一步】&#xff1b;4、点击【创建】即…

解决方案:GitHub搭建的网站突然不能访问了

之前在学习htmlcss前端相关知识的时候&#xff0c;通过搭建GitHub免费提供的网站&#xff0c;将自己实现的简单的demo网页放在了网站上。 之前访问的地址如下&#xff1a; https://zeyangwang.github.io/index.html之后很长一段时间没有去理睬&#xff0c;想起来收藏夹中的这…

php做网站步骤_自己做网站,4个步骤轻松搞定

如果您打算开始自己做网站&#xff0c;但是不知道从哪里开始&#xff0c;那么您来对地方了。当你看到这个标题的时候&#xff0c;是的&#xff0c;4个步骤轻松搭建属于自己的网站。而且您无需了解任何代码、网站设计或网站开发方面的知识。只需要跟着我的步骤&#xff0c;可以在…

华为服务器如何设置网站dns,华为ensp服务器dns配置

华为ensp服务器dns配置 内容精选换一换内网下载镜像失败基本上都是由于DNS配置问题导致的&#xff0c;可以采用以下两种方法进行修改。方法一&#xff1a;编辑“/etc/resolv.conf”文件&#xff0c;在/etc/resolv.conf中新增一个内网DNS服务器地址&#xff0c;具体的内网DNS地址…

深度学习算法实验平台网站的设计与实现

本文课题构建一个深度学习算法实验平台&#xff0c;是为颈动脉医疗图像深度学习识别斑块提供服务的。制作一个集成的深度学习工具包&#xff0c;颈动脉医疗图像的深度学习代码都可以在本平台上运行&#xff0c;平台基于TensorFlow、Caffe、CNTK、Keras、Theano等多种深度学习框…

基于Python与Node.js实现的医疗图像库在线存储与检索平台网站

图像数据相对于一般的文本数据来说管理起来更具有复杂性。传统的图像存储方式有两种&#xff0c;一是直接将图像存入数据库&#xff0c;二是将图像存放在文件系统&#xff0c;而将路径存放在数据库&#xff0c;前一种基于“大字段数据最好不要存放在数据库中”这种规则一般不被…

基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现

本文使用Asp.Net Core 和MsSqlServer技术&#xff0c;详细说明开发校园知识论坛系统的开发。校园知识论坛系统是基本B/S模式的一种交互性极强的电子信息服务系统。它为使用者提供一个交流的平台&#xff0c;每一个用户都可以在上面问答知识&#xff0c;获取信息&#xff0c;发布…