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系统的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/236727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux本地部署openGauss开源数据管理系统并结合内网穿透公网访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

计算机毕业设计 基于Web的网上购物系统(pc端仿淘宝系统)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

3.vue学习笔记(条件渲染+列表渲染+通过key管理状态)

文章目录 1.条件渲染1.1. v-if1.2. v-else-if1.3. v-show1.4. v-if与v-show区别 2.列表渲染2.1. 复杂数据2.2. v-for与对象 3.通过key管理状态 1.条件渲染 在vue中&#xff0c;提供了条件渲染&#xff0c;这类似于JavaScript中的条件语句v-ifv-elsev-else-ifv-show1.1. v-if …

python中tkinter实现GUI程序:三个实例

python中tkinter实现GUI程序 写在最前面Python中使用Tkinter实现GUI程序的基本元素Tkinter简介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件处理 1.用 tkinter实现一个简单的 GUI程序,单击“click”按钮&…

leetcode-21-合并两个有序链表(C语言实现)

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出…

Linux网络——高级IO

目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO&#xff1a; 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…

Python 学习笔记之 networkx 使用

介绍 networkx networkx 支持创建简单无向图、有向图和多重图&#xff1b;内置许多标准的图论算法&#xff0c;节点可为任意数据&#xff1b;支持任意的边值维度&#xff0c;功能丰富&#xff0c;简单易用 networkx 中的 Graph Graph 的定义 Graph 是用点和线来刻画离散事物…

【JAVA基础】----第一天

【JAVA基础】----第一天 命名规则注释方式对HelloWorld代码进行解释常量&#xff0c;进制转换和机器码展现计算过程常量类型1.字符串常量2.整数常量 提供了四种表现形式2.1 二进制2.2 八进制2.3 十进制2.4 十六进制2.5 进制之间的转化2.5.1 其他进制转化为十进制2.5.2 十进制转…

【算法优选】 动态规划之路径问题——贰

文章目录 &#x1f38b;前言&#x1f332;[下降最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f38d;[最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&…

初识RabbitMQ

一、消息队列 1、消息队列的介绍 在介绍RabbitMQ之前&#xff0c;首先来介绍下消息队列。消息队列是生产者-消费者模型的一个典型的代表&#xff0c;由一端往消息队列中不断的写入消息&#xff0c;而另一端则可以读取或者订阅队列中的消息。当新的消息入队时&#xff0c;就会通…

12.11

1.q&#xff0c;w&#xff0c;e亮led1&#xff0c;2&#xff0c;3&#xff1b; a&#xff0c;s&#xff0c;d灭led1&#xff0c;2&#xff0c;3&#xff1b; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…

红队攻防实战之Redis-RCE集锦

心若有所向往&#xff0c;何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379&#xff0c;尝试Redis弱口令或未授权访问 尝试进行连接Redis&#xff0c;连接成功&#xff0c;存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …

透析跳跃游戏

关卡名 理解与贪心有关的高频问题 我会了✔️ 内容 1.理解跳跃游戏问题如何判断是否能到达终点 ✔️ 2.如果能到终点&#xff0c;如何确定最少跳跃次数 ✔️ 1. 跳跃游戏 leetCode 55 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表…

[MySQL]SQL优化之索引的使用规则

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引失效 &#x1f4d5;最左前缀法则 &#x1f4d5;范围查询> &#x1f4d5;索引列运算&#xff0c;索引失效 &#x1f4d5;前模糊匹配 &#x1f4d5;or连接的条件 &#x1f4d5;字符串类型不加 …

C语言中的一维数组与二维数组

目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建&#xff1f; int count…

计算机丢失msvcp140dll怎么恢复?快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140dll丢失”。msvcp140.dll是一个动态链接库文件&#xff0c;它包含了许多C标准库函数的实现。这些动态链接库文件是程序运行所必需的&#xff0c;它们包含了许多函数和资源&#xf…

spring结合设计模式之策略模式

策略模式基本概念&#xff1a; 一个接口或者抽象类&#xff0c;里面两个方法&#xff08;一个方法匹配类型&#xff0c;一个可替换的逻辑实现方法&#xff09;不同策略的差异化实现(就是说&#xff0c;不同策略的实现类) 使用策略模式替换判断&#xff0c;使代码更加优雅。 …

Guava反射工具详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Java反射&#xff0c;特别是在Guava这个强大的库中&#xff0c;它是怎么让反射变得更简单&#xff0c;更有趣的。咱们都知道&#xff0c;反射在Java中是个相当强大的特性&#xff0c;它允许程序在运…

AcWing 95. 费解的开关(递推)

题目链接 活动 - AcWing 本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向有一定编程基础的同学。https://www.acwing.com/problem/content/97/ 题解 只要第一行开关的状态确定&#xff0c;则所有开关的状态都可以被推出来。第一行开关总共有种操…

从零开始学R语言?这个网站帮你快速入门,成为数据分析高手!

介绍&#xff1a;R语言&#xff0c;全称The R Programming Language&#xff0c;是一种属于GNU系统的自由、免费、源代码开放的软件。它主要被用于统计计算和统计制图&#xff0c;因此&#xff0c;它是统计分析和数据可视化的优秀工具。 R语言的特点丰富多样。首先&#xff0c;…