进程间通信——管道深入

1、有名管道怎么实现C/S模型?

  此时我要做的就是服务器端,跟客户端进行通信,必须的打开2个终端进行不同进程间的通信。

  思路分析:

  i>、首先必须的有2个管道文件;服务器端创建一个管道文件,客户端创建一个管道文件。

  ii>、服务器端的管道文件首先进行发送,客户端的对应该管道文件进行接收;客户端创建的管道文件,服务器端对应该管道文件进行接收。

  iii>、因为管道具有阻塞的性质,服务器端(发-->读),客户端(读-->发),就可以实现通信了。

模型分析

wKiom1ff8k-S4rIkAAAtSOISyOw350.png-wh_50

代码实现:

服务器端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
 
#define write_fifo  "./tmp"
#define read_fifo   "./tmp1"
 
int  main( void ){
     int  res = mkfifo(write_fifo, O_CREAT | O_EXCL | 0755);
     if (res == -1){
         perror ( "mkfifo" );
         return  -1; 
     }   
     printf ( "Server Wait Client Connect......\n" );
     int  write_fd;
     write_fd = open(write_fifo, O_WRONLY);
     if (write_fd == -1){
         perror ( "open write_fifo" );
         unlink(write_fifo);
         return  -1; 
     }   
 
     int  read_fd;
     while ((read_fd = open(read_fifo, O_RDONLY)) == -1){
         sleep(1);
     }
     printf ( "Client Connect Server OK.\n" );
 
     char  sendbuf[80];
     char  recvbuf[80];
 
     while (1){
         printf ( "Ser :>" );
         scanf ( "%s" , sendbuf);
         if ( strncmp (sendbuf,  "quit" , 4) == 0){
             break ;
         }
         write(write_fd, sendbuf,  strlen (sendbuf)+1);
 
         read(read_fd, recvbuf,  sizeof (recvbuf));
         printf ( "Cli :>%s\n" , recvbuf);
     }
 
     unlink(write_fifo);
     return  0;
}

客户端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
 
#define write_fifo  "./tmp"
#define read_fifo   "./tmp1"
 
int  main( void ){
     int  read_fd = open(write_fifo, O_RDONLY);
     if (read_fd == -1){
         perror ( "open" );
         return  -1; 
     }   
 
     int  res = mkfifo(read_fifo, O_CREAT | O_EXCL | 0755);
     if (res == -1){
         perror ( "mkfifo" );
         return  -1; 
     }   
     int  write_fd = open(read_fifo, O_WRONLY);
     if (write_fd == -1){
         perror ( "open read_fifo" );
         unlink(read_fifo);
         return  -1; 
     }   
 
     char  sendbuf[80];
     char  recvbuf[80];
     while (1){
         read(read_fd, recvbuf,  sizeof (recvbuf));
         printf ( "Ser :>%s\n" , recvbuf);
         printf ( "Cli :>" );
         scanf ( "%s" , sendbuf);
         if ( strncmp (sendbuf,  "quit" , 4) == 0){
             break ;
         }
         write(write_fd, sendbuf,  strlen (sendbuf)+1);
     }
 
     unlink(read_fifo);
     return  0;
}

运行结果

服务器端截图

wKiom1ff9I2z6XpVAAB5cWeSXVU260.png-wh_50

客户端截图

wKiom1ff9L2jqlYHAABRGPamwTE097.png-wh_50

看管道文件

wKioL1ff9TjwyJ_9AAActG9wc_s876.png-wh_50


2、怎么对上面的这个一问一答进行扩充?

  就是形成一个人可以发多条语句(不在是上面的一人一条语句)?

  思路分析:

  (1)、这就的在有名管道,服务器层和客户端层上分别形成一个父子进程;

  (2)、因为管道有阻塞的作用,服务器端子进程先进行发数据(收数据的父进程因为管道此时为空,被阻塞),而因为是子进程,可以在循环中一次发多条语句,让另一端收到。另一端发数据时,该端的发数据就被阻塞了。

  (3)、就这样,利用父子进程进行收发收据,就可以达到多条语句的发送。

跟上面是一个模型,只不过进行了扩展。

代码实现:

服务器端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
 
#define write_fifo  "./tmp"
#define read_fifo   "./tmp1"
 
void  sendData( int  write_fd);
void  recvData( int  read_fd);
 
void  recvData( int  read_fd){
     char  recvbuf[80];
     while (1){
         read(read_fd, recvbuf,  sizeof (recvbuf));
         printf ( "Cli :>%s\n" , recvbuf);
     }
}
 
void  sendData( int  write_fd){
     char  sendbuf[80];
     while (1){
         printf ( "Ser :>" );
         scanf ( "%s" , sendbuf);
         if ( strncmp (sendbuf,  "quit" , 4) == 0){
             break ;
         }
         write(write_fd, sendbuf,  strlen (sendbuf)+1);
     }
}
 
int  main( void ){
     int  res = mkfifo(write_fifo, O_CREAT | O_EXCL | 0755);
     if (res == -1){
         perror ( "mkfifo" );
         return  -1;
     }
     printf ( "Server Wait Client Connect......\n" );
     int  write_fd;
     write_fd = open(write_fifo, O_WRONLY);
     if (write_fd == -1){
         perror ( "open write_fifo" );
         unlink(write_fifo);    //关闭管道文件。
         return  -1;
     }
 
     int  read_fd;
     while ((read_fd = open(read_fifo, O_RDONLY)) == -1){
         sleep(1);
     }
     printf ( "Client Connect Server OK.\n" );
 
     pid_t pid; 
     pid = fork();
     if (pid == 0){
         sendData(write_fd);
         return  -1;
     } else  if (pid > 0){
         recvData(read_fd);
         int  status;
         wait(&status);
     } else {
         perror ( "fork" );
     }
 
     unlink(write_fifo);
     return  0;
}

客户端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
 
#define write_fifo  "./tmp"
#define read_fifo   "./tmp1"
 
 
void  sendData( int  write_fd);
void  recvData( int  read_fd);
 
void  recvData( int  read_fd){
     char  recvbuf[80];
     while (1){
         read(read_fd, recvbuf,  sizeof (recvbuf));
         printf ( "Ser :>%s\n" , recvbuf);
     }   
}
 
void  sendData( int  write_fd){
     char  sendbuf[80];
     while (1){
         printf ( "Cli :>" );
         scanf ( "%s" , sendbuf);
         if ( strncmp (sendbuf,  "quit" , 4) == 0){ 
             break ;
         }
         write(write_fd, sendbuf,  strlen (sendbuf)+1);
     }
}
 
int  main( void ){
     int  read_fd = open(write_fifo, O_RDONLY);
     if (read_fd == -1){
         perror ( "open" );
         return  -1;
     }
 
     int  res = mkfifo(read_fifo, O_CREAT | O_EXCL | 0755);
     if (res == -1){
         perror ( "mkfifo" );
         return  -1;
     }
     int  write_fd = open(read_fifo, O_WRONLY);
     if (write_fd == -1){
         perror ( "open read_fifo" );
         unlink(read_fifo);
         return  -1;
     }
 
     pid_t pid;      
     pid = fork();
     if (pid == 0){
         sendData(write_fd);
         return  -1;
     } else  if (pid > 0){
         recvData(read_fd);
         int  status;
         wait(&status);
     } else {
         perror ( "fork" );
     }
 
     unlink(read_fifo);
     return  0;
}

运行结果

服务器端截图

wKiom1fgBn-iwyadAABXtAgWUuI238.png-wh_50

客户端截图

wKioL1fgBs_B6khJAAA_ZTkIX64239.png-wh_50

看管道文件截图

wKioL1fgB6miUCioAAAZuKpwOVc318.png-wh_50

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
项目描述:建立购物小商城平台. 实现了前台页面系统。 技术描述:通过Spring 主框架来管理Struts2和Hibernate 框架搭建的电商小平台,用MySQL数据库并创建了表有用户表,订单表,商品表,商品分类表,商品内容表,购物车表等来存储数据。用到hibernate….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值