Linux系统---基于Pipe实现一个简单Client-Server system

顾得泉: 个人主页

个人专栏: 《Linux操作系统》 《C/C++》 《LeedCode刷题》

键盘敲烂,年薪百万!


一、题目要求

Server是一个服务器进程,只能进行整数平方运算。Client要计算一个整数的平方的平方的平方,即(((x)^2)^2)^2,我们通过Client与Server的三次通信来完成计算:第一次Client通过command管道将x送到Server,由Server计算出x^2,并通过response管道送回Client。第二次,Client收到x^2后,将其通过command管道再次送到Server,由Server计算出(x^2)^2,并通过response管道送回Client。如此过程,经过三次通信过程,可以计算出(((x)^2)^2)^2,然后由Client打印出计算结果。


二、模块描述

本文用于创建一个子进程,并通过管道进行通信。主进程将一个整数n发送给子进程,子进程计算n的平方并将结果返回给主进程。最后,主进程打印出子进程计算得到的结果。

1.首先,通过atoi(argv[1])将命令行参数转换为整数n。

2.定义两个整数数组com和res,分别用于存储管道的读端和写端的文件描述符。

3.使用pipe()函数创建两个管道,分别将com[0]和com[1]作为读端,将res[0]和res[1]作为写端。

4.使用fork()函数创建一个子进程。如果创建失败,输出错误信息并退出程序。

5.如果当前进程是父进程(pid > 0),则关闭管道的读端和写端,然后循环4次,每次向管道的写端写入整数n,并从管道的读端读取整数n。

6.在循环结束后,打印子进程计算得到的结果n,然后使用kill()函数发送SIGKILL信号终止子进程,接着使用waitpid()函数等待子进程结束。最后,退出主进程。

7.如果当前进程是子进程(pid == 0),则关闭管道的读端和写端,然后进入一个无限循环。在循环中,从管道的读端读取整数n,计算n的平方,并将结果写入管道的写端。当读取到的整数为负数时,跳出循环。最后,退出子进程。


三、代码实现

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

#define MAXLINE 20  

int main(int argc, char* argv[]) 
{
    int n = atoi(argv[1]);  
    int com[2];   
    int res[2];   
    pid_t pid;

    if (pipe(com) < 0 || pipe(res) < 0) 
    {
        perror("pipe error");
        exit(EXIT_FAILURE);
    }

    if ((pid = fork()) < 0) 
    {
        perror("fork error");
        exit(EXIT_FAILURE);
    }

    if (pid > 0) 
    {    
        close(com[0]);  
        close(res[1]); 

        for (int i = 1; i < 4; i++) 
        {
            write(com[1], &n, sizeof(int));  
            read(res[0], &n, sizeof(int));  

        }

        printf("result is %i\n", n);
        kill(pid, SIGKILL);   
        waitpid(pid, NULL, 0); 
        exit(EXIT_SUCCESS);
    } 
    else 
    {     
        close(com[1]);  
        close(res[0]);  

        while (1) 
        {
            if (read(com[0], &n, sizeof(int)) <= 0)  
                break;  
            n = n * n;   
            write(res[1], &n, sizeof(int));  
        }

        exit(EXIT_SUCCESS);
    }
}

四、结果展示

当我们把相对应的文档编辑好后,首先进行的是gcc操作,接着进行运行,运行的时候要把相对应要求的参数传进去,比方说要求2的8次方,就进行下述操作,具体实现步骤与结果如下:


**结语:**Linux系统基于Pipe实现一个简单Client-Server system系统的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~

相关推荐
飞函安全2 小时前
私有化一站式办公平台,协同办公更高效
运维·安全·信息与通信
2301_801387292 小时前
网络、API 连接和 pod 启动的问题
运维·网络·kubernetes
渡我白衣2 小时前
计算机组成原理(4):计算机的层次结构与工作原理
运维·c语言·网络·c++·人工智能·笔记·硬件架构
Mr_sun.2 小时前
Docker中安装软件汇总(留存版)
运维·docker·容器
询问QQ:4877392783 小时前
用NSGA - II算法在Matlab中实现微电网多目标优化调度
linux
weixin_307779133 小时前
Jenkins Jackson 2 API插件详解:JSON处理的基础支柱
运维·开发语言·架构·json·jenkins
缘友一世3 小时前
Kubuntu 24.04.3 LTS启用RooT用户sddm桌面登陆
linux·ubuntu
徐子元竟然被占了!!3 小时前
Linux-du
linux·运维·服务器
Howe~zZ3 小时前
mybatis 报错解决方案ORA-01795: maximum number of expressions in a list is 1000
java·服务器·前端
Awkwardx3 小时前
Linux网络编程—传输层协议UDP和TCP
linux·网络·tcp/ip·udp