TCP/IP网络编程笔记-ch11.进程间通信

函数

创建管道

#include<unistd.h>

@param filedes[0]:通过管道接收数据时使用的文件描述符,即管道出口
@parma filedes[1]:通过管道传输数据时使用的文件描述符,即管道入口
int pipe(int filedes[2])
//成功返回0.失败返回-1

以长度为2的int数组地址符作为参数调用上述函数,数组中存有两个文件描述符,它们被作为管道的出口和入口。  
父进程调用该函数时创建管道,同时获取对应于出入口的文件描述符,此时父进程可读写统一管道。
而父进程与子进程进行数据交换则通过将入口或出口中的1个文件描述符传递给子进程。
通过调用fork函数来实现将文件描述符传递给子进程。

如:
int fds[2];

pipe(fds);
pid_t pid=fork();

if(pid==0)
{
    write(fds[1),str,sizeof(str));
}
else
{
    read(fds[0],buf,BUF_SIZE);
    puts(buf);
}

知识点

进程间通信的基本概念

进程间通信(Inter Process Communication)意味着两个不同进程间可以交换数据,为完成这点,操作系统中应提供两个进程可以同时访问的内存空间。

对进程间通信的基本理解

进程A通过某变量将自己的状态通知给进程B,进程B通过该变量了解到进程A的转台。即只要有两个进程可以同时访问的内存空间,就可以通过此空间交换数据。
但进程具有完全独立的内存结构,就连通过fork函数创建的子进程也不会与父进程共享内存空间。因此,进程间通信智能通过其他特殊方法形成。

通过管道实现进程间通信

为完成进程间通信,需创建管道。管道并非属于进程的资源,而是和套接字一样,属于操作系统,故两个进程通过操作系统提供的内存空间进行通信。
创建管道函数见函数区域。

###通过管道进行进程间双向通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ALLtxCLb-1643794161201)(https://note.youdao.com/yws/res/e/WEBRESOURCE076b8a629bbee8d977aeb495a2893c4e)]

int fds[2];

pipe(fds);
pid_t pid=fork();
if(pid==0)
{
    write(fds[1),str1,sizeof(str));//写入管道
    sleep(2);
    read(fds[0],buf,BUF_SIZE);//从管道读取
}
else//父进程
{
    read(fds[0],buf,BUF_SIZE);//从管道读取
    sleep(2);
    write(fds[1],str2,sizeof(str2));//写入管道
}

数据进入管道后成为无主数据,通过read函数先读取数据的进程将得到数据,即使进程将数据传到管道。

因此只使用1个管道进行双向通信并非易事,为此通过"创建2个管道"来实现双向通信,各自负责不同的数据流。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKTXSFJC-1643794161202)(https://note.youdao.com/yws/res/5/WEBRESOURCE4a27f624e0af8da056989d0acf743dd5)]

实例

通过fork传递管道文件描述符:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uwEZSXGe-1643794161203)(https://note.youdao.com/yws/res/9/WEBRESOURCE9e7bf2260a1e1475219ef08a0df8b509)]

通过1个管道实现双向通信:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJJksdD7-1643794161203)(https://note.youdao.com/yws/res/6/WEBRESOURCE6ec4520620c5a555e089fc5e958156e6)]

通过2个管道实现双向通信:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGSvZyC6-1643794161203)(https://note.youdao.com/yws/res/7/WEBRESOURCE130ba48804e9565210b184ec161ab9d7)]

保存消息的回声服务器端:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAauC87T-1643794161203)(https://note.youdao.com/yws/res/7/WEBRESOURCE0d1a1cfaee8ce3719308745e624cb257)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值