《TCP/IP网络编程》阅读笔记--进程间通信
目录
1--进程间通信
2--pipe()函数
3--代码实例
3-1--pipe1.c
3-2--pipe2.c
3-3--pipe3.c
3-4--保存信息的回声服务器端
1--进程间通信
为了实现进程间通信,使得两个不同的进程间可以交换数据,操作系统必须提供两个进程可以同时访问的内存空间;
为了完成进程间通信,需要创建管道(pipe);管道并非属于进程的资源,而是属于操作系统;
2--pipe()函数
#include <unistd.h>
int pipe(int filedes[2]);
// 成功时返回0,失败时返回-1
// filedes[0] 通过管道接收数据时使用的文件描述符,即管道出口
// filedes[1] 通过管道传输数据时使用的文件描述符,即管道入口
3--代码实例
3-1--pipe1.c
子进程从管道入口写数据,父进程从管道出口读数据;
// gcc pipe1.c -o pipe
// ./pipe#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30int main(int argc, char *argv[]){int fds[2];char str[] = "Who are you?";char buf[BUF_SIZE];__pid_t pid;pipe(fds); // 创建管道pid = fork();if(pid == 0){ // 子进程执行区域write(fds[1], str, sizeof(str)); // 向管道入口写数据}else{ // 父进程执行区域read(fds[0], buf, BUF_SIZE); // 向管道出口读数据puts(buf);}return 0;
}

3-2--pipe2.c
利用一个管道实现父进程与子进程的双向通信;
// gcc pipe2.c -o pipe2
// ./pipe2#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30int main(int argc, char *argv[]){int fds[2];char str1[] = "Who are you?";char str2[] = "Thank you for your message";char buf[BUF_SIZE];__pid_t pid;pipe(fds); // 创建管道pid = fork();if(pid == 0){ // 子进程执行区域write(fds[1], str1, sizeof(str1)); sleep(2); // sleep的作用是防止子线程写的数据被子线程自身读取了,导致父进程一直等待read(fds[0], buf, BUF_SIZE);printf("Child proc output: %s \n", buf);}else{ // 父进程执行区域read(fds[0], buf, BUF_SIZE); printf("Parent proc output: %s \n", buf);write(fds[1], str2, sizeof(str2));sleep(3);}return 0;
}

3-3--pipe3.c
利用两个管道实现父进程与子进程的双向通信,其中收发数据在不同的管道上进行;
// gcc pipe3.c -o pipe3
// ./pipe3#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30int main(int argc, char *argv[]){int fds1[2], fds2[2];char str1[] = "Who are you?";char str2[] = "Thank you for your message";char buf[BUF_SIZE];__pid_t pid;pipe(fds1), pipe(fds2); // 创建管道pid = fork();if(pid == 0){ // 子进程执行区域write(fds1[1], str1, sizeof(str1)); // 通过管道1写数据read(fds2[0], buf, BUF_SIZE); // 通过管道2读数据printf("Child proc output: %s \n", buf);}else{ // 父进程执行区域read(fds1[0], buf, BUF_SIZE); // 通过管道1读数据printf("Parent proc output: %s \n", buf);write(fds2[1], str2, sizeof(str2)); // 通过管道2写数据sleep(3);}return 0;
}

3-4--保存信息的回声服务器端
服务器端创建两个进程,一个进程负责与客户端进行通信,将客户端发来的数据通过管道入口写到管道中;另一个进程负责从管道出口中读取数据,并把读取的数据保存在文件中;
具体可运行代码参考:Chapter11
// gcc echo_storeserv.c -o echo_storeserv
// ./echo_storeserv 9190#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}void read_childproc(int sig){__pid_t pid;int status;pid = waitpid(-1, &status, WNOHANG);printf("remove proc id: %d \n", pid);
}int main(int argc, char* argv[]){int serv_sock, clnt_sock;struct sockaddr_in serv_adr, clnt_adr;int fds[2];__pid_t pid;struct sigaction act; // 信号socklen_t adr_sz;int str_len, state;char buf[BUF_SIZE];if(argc != 2){printf("Usage : %s <port>\n", argv[0]);exit(1);}act.sa_handler = read_childproc; //设置信号处理函数sigemptyset(&act.sa_mask);act.sa_flags = 0;state = sigaction(SIGCHLD, &act, 0);serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 创建 tcp socketmemset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family = AF_INET;serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);serv_adr.sin_port = htons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr)) == -1){error_handling("bind() error"); } if(listen(serv_sock, 5) == -1){error_handling("listen() error");}pipe(fds);pid = fork();if(pid == 0){ // 子进程执行区域FILE* fp = fopen("echomsg.txt", "wt");char msgbuf[BUF_SIZE];int i, len;for(i = 0; i < 10; i++){len = read(fds[0], msgbuf, BUF_SIZE);fwrite((void*)msgbuf, 1, len, fp);}fclose(fp);return 0;}while(1){adr_sz = sizeof(clnt_adr);clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz);if(clnt_sock == -1){continue;}else{puts("new client connected...");}pid = fork();if(pid == 0){close(serv_sock);while((str_len = read(clnt_sock, buf, BUF_SIZE)) != 0){write(clnt_sock, buf, str_len);write(fds[1], buf, str_len);}close(clnt_sock);puts("client disconnected...");return 0;}else{close(clnt_sock);}}close(serv_sock);return 0;}

相关文章:
《TCP/IP网络编程》阅读笔记--进程间通信
目录 1--进程间通信 2--pipe()函数 3--代码实例 3-1--pipe1.c 3-2--pipe2.c 3-3--pipe3.c 3-4--保存信息的回声服务器端 1--进程间通信 为了实现进程间通信,使得两个不同的进程间可以交换数据,操作系统必须提供两个进程可以同时访问的内存空间&am…...
mysql中show status参数介绍
Uptime_since_flush_status, 2159061:自上次刷新状态以来的服务器运行时间(以秒为单位)。Uptime, 2159061:服务器的总运行时间(以秒为单位)。Threads_running, 2:当前正在运行的客户端线程数。T…...
Tomcat服务的部署及配置优化
文章目录 1. Tomcat的相关介绍1.1 Tomcat简介1.2 Tomcat的核心组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器 1.3 Tomcat的功能组件1.3.1 connector连接器1.3.2 container容器1.3.2.1 子容器及其相关功能 1.4 主要作用1.5 Tmocat处理请求的过程 2. Tomcata服务部署2.1 安装…...
入门力扣自学笔记279 C++ (题目编号:1123)
1123. 最深叶节点的最近公共祖先 题目: 给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。 回想一下: 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0,如果某一节点的深度为 d,那它…...
【AIGC专题】Stable Diffusion 从入门到企业级实战0402
一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节, 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。上一节,我们介绍了《Stable Diffusion C…...
【Spring事务】Spring事务的传播机制(通俗易懂)
目录 什么是spring事务 Spring事务的传播机制 什么是spring事务 封装在数据库事务之上的一种事务处理机制。其管理方法有两种,分别是编程式事务以及声明式事务。一般我们使用Transactional进行声明式事务。 Spring事务的传播机制 Spring的事务传播机制种类 传播行…...
使用 Python 的高效相机流
一、说明 让我们谈谈在Python中使用网络摄像头。我有一个简单的任务,从相机读取帧,并在每一帧上运行神经网络。对于一个特定的网络摄像头,我在设置目标 fps 时遇到了问题(正如我现在所理解的——因为相机可以用 mjpeg 格式运行 30…...
pycharm使用
在使用pycharm时,有时一个回车或者一个tab键,缩进的长度不符合预期可以调整设置tab键缩进的长度: 平时工作中,不同的人在编辑代码缩进的时候,有的人喜欢按四个或者六个空格,有的人喜欢按tab键,而…...
C++项目实战——基于多设计模式下的同步异步日志系统-②-相关技术补充(不定参函数)
文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C、Linux 学…...
iOS开发Swift-10-位置授权, cocoapods,API,天气获取,城市获取-和风天气App首页代码
1.获取用户当前所在的位置 在infi中点击加号,选择权限:当用户使用app的时候获取位置权限. 填写使用位置权限的目的. 2.获取用户的经纬度. ViewController: import UIKit import CoreLocationclass ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLL…...
CNN(七):ResNeXt-50算法的思考
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 在进行ResNeXt-50实战练习时,我也跟其他学员一样有这个疑惑,如下图所示: 反复查看代码,仍然有…...
【人月神话】深入了解软件工程和项目管理
文章目录 👨⚖️《人月神话》的主要观点👨🏫《人月神话》的主要内容👨💻作者介绍 🌸🌸🌸🌷🌷🌷💐💐💐&a…...
52、基于函数式方式开发 Spring WebFlux 应用
★ Spring WebFlux的两种开发方式 1. 采用类似于Spring MVC的注解的方式来开发。此时开发时感觉Spring MVC差异不大,但底层依然是反应式API。2. 使用函数式编程来开发★ 使用函数式方式开发Web Flux 使用函数式开发WebFlux时需要开发两个组件: ▲ Han…...
MySQL的用户管理
1、MySQL的用户管理 (1)创建用户 create user zhang3 identified by 123123;表示创建名称为zhang3的用户,密码设为123123。 (2)了解user表 1)查看用户 select host,user,authentication_string,select…...
LeetCode //C - 114. Flatten Binary Tree to Linked List
114. Flatten Binary Tree to Linked List Given the root of a binary tree, flatten the tree into a “linked list”: The “linked list” should use the same TreeNode class where the right child pointer points to the next node in the list and the left child …...
利用transform和border 创造简易图标,以适应uniapp中多字体大小情况下的符号问题
heml: <text class"icon-check"></text> css: .icon-check {border: 2px solid black;border-left: 0;border-top: 0;height: 12px;width: 6px;transform-origin: center;transform: rotate(45deg);} 实际上就是声明一个带边框的div 将其中相邻的两边去…...
C/C++指针函数与函数指针
一、指针函数 指针函数:本质为一个函数,返回值为指针指针函数:如果一个函数的返回值是指针类型,则称为指针函数用指针作为函数的返回值的好处:可以从被调函数向主函数返回大量的数据,常用于返回结构体指针。…...
30天入门Python(基础篇)——第1天:为什么选择Python
文章目录 专栏导读作者有话说为什么学习Python原因1(总体得说)原因2(就业说) Python的由来(来自百度百科)Python的版本 专栏导读 🔥🔥本文已收录于《30天学习Python从入门到精通》 🉑🉑本专栏专门针对于零基础和需要重新复习巩固…...
智慧公厕破解公共厕所管理的“孤岛现象”
在现代社会中,公共厕所是城市管理中的一项重要任务。然而,经常会出现公厕管理的“孤岛现象”,即每个公厕都是独立运作,缺乏统一的管理和监控机制。针对这一问题,智慧公厕的出现为解决公共厕所管理难题带来了新的方案。…...
excel中删除重复项
数据如图: 要删除姓名这一列的重复项,操作: (1)选中姓名这一列(2)点击“数据”(3)点击“删除重复项" 这是excel会自动检测出还有别的关联列 直接默认,点击删除重复项...弹出下面的界面 因为我们只要删除“姓名”列的重复值&…...
CANOE Demo版快速下载与激活指南
1. CANOE Demo版是什么?为什么你需要它? 如果你正在学习汽车电子开发或者从事相关领域的工作,CANOE这个名字一定不会陌生。作为Vector公司推出的主流汽车总线开发工具,它几乎成了行业标准。但对于刚入门的新手来说,动辄…...
FreeRTOS实战指南:从消息队列到内存管理,手把手解决嵌入式多任务难题
FreeRTOS实战指南:从消息队列到内存管理,手把手解决嵌入式多任务难题 1. 为什么嵌入式开发者需要FreeRTOS 在资源受限的嵌入式系统中,开发者常常面临这样的困境:既要处理实时性要求高的传感器数据采集,又要兼顾用户界面…...
Deepin Boot Maker:智能解析引擎驱动的跨平台启动盘制作方案
Deepin Boot Maker:智能解析引擎驱动的跨平台启动盘制作方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker是一款采用智能解析引擎的跨平台开源工具,通过自动化流程与硬…...
别再只懂概念了!用JSEncrypt库5分钟搞定前端RSA密码加密实战
前端RSA加密实战:用JSEncrypt保护用户密码传输安全 1. 为什么前端需要加密? 在Web应用开发中,用户登录是最基础也最敏感的操作之一。传统表单提交直接将密码以明文形式发送到服务器,这在网络传输过程中存在被截获的风险。即使使…...
深度学习模型压缩:从原理到实践
深度学习模型压缩:从原理到实践 1. 背景与动机 深度学习模型在各种任务上取得了显著的性能提升,但随之而来的是模型规模的不断增长。大型模型虽然性能优异,但也带来了以下问题: 存储需求大:大型模型需要大量存储空间&a…...
PHP 8.5 升级生存指南:避免凌晨两点回滚的检查清单
定目标版本,定义内部支持策略在动 CI 或 Composer 之前,先回答一个问题:在你的组织里,这次升级"完成"意味着什么?确定目标和截止日期PHP 分支有两年的活跃支持,然后是两年的安全修复。官方支持表…...
Word空白页删不掉?【图文讲解】怎么删除word空白页?word批量删除空白页?5种方法教你彻底删除
(1)问题背景谁在编辑 Word 时没被顽固空白页气到抓狂?写论文、做报告、整理文案,明明内容已经结束,页面末尾偏偏多出一页空白,删也删不掉、退也退不去。打印时白白浪费纸张,上交文档显得格外不专…...
Kali Linux安装失败?5个常见报错解决方案(虚拟机专用版)
Kali Linux虚拟机安装报错实战指南:5个高频问题深度解析 当你兴致勃勃地在VMware里安装Kali Linux准备大展身手时,突然弹出的报错信息就像一盆冷水浇下来。别急着重装——90%的安装问题都有现成解决方案。本文将聚焦虚拟机环境下最棘手的5类安装报错&…...
4步构建高效视频处理流水线:VideoFusion全功能指南
4步构建高效视频处理流水线:VideoFusion全功能指南 【免费下载链接】VideoFusion 一站式短视频拼接软件 无依赖,点击即用,自动去黑边,自动帧同步,自动调整分辨率,批量变更视频为横屏/竖屏 项目地址: https://gitcode.com/gh_mirrors/vi/VideoFusion 功能特性…...
wan2.1-vae中英文双语支持实测:中文提示词准确率92%+英文prompt兼容性验证
wan2.1-vae中英文双语支持实测:中文提示词准确率92%英文prompt兼容性验证 1. 平台核心能力解析 wan2.1-vae是基于Qwen-Image-2512模型的AI图像生成平台,其最大特色在于原生支持中英文双语提示词。在实际测试中,中文提示词的理解准确率达到9…...
