TCP/IP 网络编程 (抄书笔记 4) -- 管道: 进程间通信

TCP/IP 网络编程 (抄书笔记 4) – 管道: 进程间通信

TCP/IP 网络编程 (抄书笔记 4) – 管道: 进程间通信

int fds[2];
pipe(fds);
write(fds[1], buf, strlen(buf));
read(fds[0], buf, BUF_SIZE);

如果两个进程的通信只是 单纯的一方写, 然后另一方读 的情况, 那么 我们的管道操作没有问题, 但是:

char str1[] = "str1";
char str2[] = "str2";
int fds[2];
pipe(fds);
...
if(pid == 0) {
        read(fds[0], buf1, BUF_SIZE);       // 这两个读请求会造成困扰, 时间先后的问题
        write(fds[1], str1, strlen(str1));
} else {
        write(fds[1], str2, strlen(str2));
        read(fds[0], buf2, BUF_SIZE);       // 这两个读请求会造成困扰, 时间先后的问题
}

解决: 创建 2 个管道进行通信

管道的用法举例

pid = fork();
if (pid == 0) {
    read(fds[0], buf, BUF_SIZE);
    ... do other things ...
} else {
    ...
    write(fds[1], buf, strlen(buf));
    ...
}

这样做的好处: 如果我们一开始的 "do other things" 放在父进程中 write 之前处理也是可以的, 但是这会增加
父进程的负担, 如果我们开个子进程来读取管道数据, 那么这个 "父进程就可以从脏活中解脱"

时间: 2024-10-11 04:23:42

TCP/IP 网络编程 (抄书笔记 4) -- 管道: 进程间通信的相关文章

TCP/IP 网络编程 (抄书笔记 5) -- select 和 IO 复用

TCP/IP 网络编程 (抄书笔记 5) – select 和 IO 复用 TCP/IP 网络编程 (抄书笔记 5) – select 和 IO 复用 利用 fork() 生成子进程 可以达到 服务器端可以同时响应多个 客户端的请求, 但是这样做有缺点: 需要大量的运算和内存空间, 每个进程都要有独立的内存空间, 数据交换也很麻烦 (IPC, 如管道) IO 复用: 以太网的总线结构也是采用了 复用技术, 如果不采用, 那么两两之间就要直接通信 网络知识 int server_sock; int

TCP/IP 网络编程 (抄书笔记 1) -- TCP

TCP/IP 网络编程 (抄书笔记 1) – TCP TCP/IP 网络编程 (抄书笔记 1) – TCP Table of Contents server client 更好的 client 端实现 来源: <TCP/IP 网络编程> 抄书: 通信的双方都各自 拥有 输入缓存和输出缓存 socket 的 write 函数并不是立即传输数据, 而是写到输出缓存区, 到达另一端的输入缓存区 socket 的 read 函数调用的瞬间, 就从输入缓存区中读取数据 TCP 协议中的滑动窗口会保证 数

TCP/IP 网络编程 (抄书笔记 2) -- UDP

TCP/IP 网络编程 (抄书笔记 2) – UDP TCP/IP 网络编程 (抄书笔记 2) – UDP Table of Contents server client connect 来源: <TCP/IP 网络编程> 抄书: TCP 协议若要向 10 个客户端提供服务, 除了需要 listen 套接字外, 还需要 10 个服务器端套接字 (accept), 但是在 UDP 中, 不管是服务器端还是客户端都只需要 1 个套接字 udp 的 client 不需要 bind, 调用 sendt

TCP/IP 网络编程 (抄书笔记 3) -- 僵尸进程和多任务并发服务器

TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 Table of Contents 僵尸进程的产生 避免僵尸进程 信号 多任务的并发服务器 僵尸进程的产生 子进程先退出, 父进程没有退出 ==> 僵尸进程 父进程先退出, 子进程没有退出 ==> 子进程被 0 号进程回收, 不会产生僵尸进程 pid_t pid = fork(); if (pid == 0) { // child printf(&

TCP/IP网络编程读书笔记-简单的套接字编程(1)

在linux和windows下都是通过套接字编程进行网络编程.不同的系统上通信有部分差别,现在刚开始学习,给自己学习的时候一个总结. 一,socket函数的套接字步骤 第一,linux网络编程中接受连接请求(服务器端)套接字的四个步骤: 1)调用socket函数创建套接字 2)调用bind函数分配IP地址和端口号 3)调用listen函数转为可接收请求状态 4)调用accept函数受理连接请求 第二,linux网络编程中请求连接(客户端)套接字的两个步骤: 1)调用socket函数创建套接字 2

TCP/IP网络编程 学习笔记_4 --OSI七层网络模型

前言:本节将概括性的总结下网络通信的整体框架,其底层流程. 我们之前了解到了套接字的创建及应用,其实我们只是在用套接字这个工具而已,其底层细节对我们是屏蔽的.要通过因特网完成数据传输,其实不光光是软件就能解决的,还需要构建硬件系统等.因此,为了解决这一难题,许多专家聚集在一起,这些人是硬件,系统,路由算法等各领域的顶级专家.他们把网络通信划分很多模块,通过层次化的结构把大问题分成若干小问题逐个攻破.每个层都有一套定义好的通信标准(协议),数据就是这样通过这个层次结构从上到下,再从下到上传输的.示

TCP/IP网络编程 学习笔记_11 --多进程服务器端

并发服务器 首先,我们来假设有下面这样两种类型的服务器:第一种,第一个连接请求的受理时间为1s,第50个连接请求的受理时间为50s,第100个连接请求的受理时间为100s.即同时很多客服端连接,需要依次排队受理,但只要受理了,他们的服务时间平均只需1s.第二种,所有连接请求的受理时间不超过1s,但平均服务时间要2~3s. 即使有可能延长服务时间,我们实际网络编程中也一般选择第二种方式,使其可以同时向所有发起请求的客服端提供服务,以提高平均满意度.而且,网络程序中数据通信时间比CPU运算时间占比更

TCP/IP网络编程 学习笔记_7 --基于UDP的服务端/客服端

理解UDP UDP套接字的特点:在笔记2中讲套接字类型有提,类似信件或邮件的传输.UDP在数据传输过程中可能丢失,如果只考虑可靠性,TCP的确比UDP好.但UDP在结构上比TCP更简洁.UDP没有ACK,SEQ那样的操作,因此,UDP的性能有时比TCP高出很多.编程中实现UDP也比TCP简单.另外,虽然UDP是不可靠的数据传输,但也不会像想象中那么频繁地发生数据丢失.因此,在更重视性能而非可靠性的情况下(如传输视频,音频时),UDP是一种很好的选择.而如果是传递压缩文件则必须要用TCP,因为压缩

TCP/IP网络编程 学习笔记_15 --多播与广播

前言:想想这么一种情况,网络电台可能需要同时向成千上万的用户传输相同的数据,如果用我们以前讲过的传输形式,每个用户都传输一次,这样肯定是不合理的.因此,就引入了多播技术来解决这个问题,它可以同时向大量用户发送相同数据.其基本原理是这样的:有个多播组,只要加入这个组里的所有客服端,服务端发送的数据它们都能收到,具体传输到多播组里的每个客户是由路由完成的(如果路由器不支持多播或网络堵塞,实现多播也会使用隧道技术). 多播 多播的数据传输特点如下: 1,多播服务器端针对特定多播组,只需发送1次数据,该