TCP/IP网络编程笔记Chapter I -10进程间通信 &保存消息的回声服务器端

本文介绍了如何利用管道实现进程间的单向和双向通信,并通过实例详细阐述了通信过程。此外,还展示了如何构建一个保存消息的回声服务器端,将客户端的输入保存到文件中。
摘要由CSDN通过智能技术生成

TCP/IP网络编程笔记Chapter I -10进程间通信 &保存消息的回声服务器端

1.利用管道实现进程的通信

进程间通信意味着两个不同的进程间可以交换数据,本节实现通过管道实现进程的通信。

(1)单向通信

基于管道的进程间通信结构模型如下,可以看出管道和套接字一样,并不属于进程的资源而是属于操作系统,所以不是fork函数复制的对象。两个进程通过操作系统提供的内存空间进行通信。
在这里插入图片描述
下面介绍创建管道的函数。

#include<unistd.h>
int pipe (int filedes[2]);
  • 成功时返回0,失败返回-1
  • filedes[0]:通过管道接收数据时使用的文件描述符,即管道出口
  • filedes[1]:通过管道传输数据时使用的文件描述符,即管道入口

父进程调用该函数将创建管道,同时获取对应出入口的文件描述符,此时父进程可以读写同一管道,但如果父进程的目的是与子进程进行数据交换,就需要调用fork函数将入口和出口中的一个文件描述符传递给子进程。
调用fork函数,子进程复制得到两个文件描述符。复制的并非管道,而是用于管道I/O的文件描述符。至此,父子进程同时拥有I/O文件描述符,子进程通过向管道传递字符串,父进程通过从管道接收字符串并输出。
上述程序的通信路径如下。
在这里插入图片描述
下面的代码子进程向父进程传递Who are you。父进程读取并输出

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
 
int 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;
}

在这里插入图片描述

(2)双向通信

①2个进程通过1个管道进行双向通信
由单向通信可知,父子进程都拥有两个文件描述符,所以可以考虑进行双向通信
在这里插入图片描述
程序实现就是在单向通信的基础上父子进程各加一各write和read函数,但是请注意两个sleep函数,我们将在后面讨论。

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
 
int 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);
        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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值