企业网站页面图片,注重网站开发设计与建设,石家庄网站建设方案优化,专门做萝莉视频网站顾得泉#xff1a;个人主页
个人专栏#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》
键盘敲烂#xff0c;年薪百万#xff01; 一、题目要求 Server是一个服务器进程#xff0c;只能进行整数平方运算。Client要计算一个整数的平方的平方的平方#xff0c;即…
顾得泉个人主页
个人专栏《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系统的分享到这里就结束了希望本篇文章的分享会对大家的学习带来些许帮助如果大家有什么问题欢迎大家在评论区留言~~~