进程任务通信3种方式

1>socket(套接字通信)

基于TCP服务器实现:

int main()
{//1、创建套接字,用于连接使用int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("端口快速重用成功\n");//2、给套接字绑定地址信息//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;    //地址族sin.sin_port = htons(PORT);    //端口号网络字节序sin.sin_addr.s_addr = inet_addr(IP); //IP地址网络字节序//2.2 绑定工作if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success _%d_\n", __LINE__);//3、将套接字设置成监听状态if(listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success _%d_\n", __LINE__);//4、阻塞等待客户端的连接请求//4.1 填充要接收的客户端地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;   //IPv4通信//客户端的主机地址和端口号就无需写了//4.2 定义接收客户端的地址信息的大小socklen_t socklen = sizeof(cin);//4.3 接收客户端的请求int newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);if(newfd == -1){perror("accept error");return -1;}printf("有新客户端连接,newfd = %d\n", newfd);//5、收发数据char buf[128] = "";      //用于接收数据的缓冲区while(1){//清空缓冲区bzero(buf, sizeof(buf));int ret = recv(newfd, buf, sizeof(buf), 0);if(ret == -1){perror("recv error");return -1;}else if(ret == 0){printf("客户端已经下线\n");break;}printf("[%s:%d] :%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);//将数据连接一个字符后发回去strcat(buf, "*_*");if(send(newfd, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}}//6、关闭套接字close(newfd);           //关闭通信的套接字close(sfd);               //关闭连接的套接字return 0;
}

基于TCP客户端实现:

int main()
{//1、创建套接字,用于连接使用int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}//设置端口号快速重用int reuse = 1;if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("端口快速重用成功\n");//2、给套接字绑定地址信息//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;    //地址族sin.sin_port = htons(PORT);    //端口号网络字节序sin.sin_addr.s_addr = inet_addr(IP); //IP地址网络字节序//2.2 绑定工作if(bind(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success _%d_\n", __LINE__);//4、连接服务器//4.1 填充要连接的服务器地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;   //IPv4通信cin.sin_port = htons(PORT);    //服务器端口号cin.sin_addr.s_addr = inet_addr(IP);      //服务器的主机地址//4.2 连接服务器if(connect(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("connect error");return -1;}printf("connect success _%d_\n", __LINE__);//5、收发数据char buf[128] = "";      //用于接收数据的缓冲区while(1){//清空缓冲区bzero(buf, sizeof(buf));//从终端上获取数据fgets(buf, sizeof(buf), stdin);buf[strlen(buf) -1] = '\0';//发送给服务器端if(send(cfd, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}printf("发送成功\n");//接收服务器发来的消息bzero(buf, sizeof(buf));int res = recv(cfd, buf, sizeof(buf), 0);if(res == -1){perror("recv error");return -1;}else if(res == 0){printf("服务器已经下线\n");break;}printf("[%s:%d] :%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);}//6、关闭套接字close(cfd);               //关闭连接的套接字return 0;
}

2>无名管道

int main()
{//定义子进程的pidpid_t pid;//1、定义管道的文件描述符数组int pipefd[2] = {0};//2、创建管道if(pipe(pipefd) != 0){perror("pipe error");return -1;}//创建子进程pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//关闭写管道close(pipefd[1]);//子进程char rbuf[128] = "";while(1){//清空容器内容memset(rbuf, 0, sizeof(rbuf));//读取父进程发送的消息read(pipefd[0], rbuf, sizeof(rbuf));printf("收到父进程消息:%s\n", rbuf);if(strcmp(rbuf, "quit") == 0){break;}}//关闭读管道close(pipefd[0]);//退出进程exit(0);}else{//关闭读管道close(pipefd[0]);//父进程char wbuf[128] = "";while(1){bzero(wbuf, sizeof(wbuf));          //清空容器内容//    printf("请输入>>");fgets(wbuf, sizeof(wbuf), stdin);          //从终端读取一个字符串wbuf[strlen(wbuf)-1] = '\0';                 //将容器中的换行变成'\0'//将该数据发送给子进程//3、向管道文件中写数据write(pipefd[1], wbuf, sizeof(wbuf));//参数1:要写入的文件描述符//参数2:要写入数据的起始地址//参数3:要写入数据的大小if(strcmp(wbuf, "quit") == 0){break;}}}wait(NULL);            //阻塞回收子进程资源//关闭写端close(pipefd[1]);return 0;
}

3>共享内存

send:

int main()
{//1、获取key值key_t key;if((key = ftok("./", 'k')) == -1){perror("ftok error");return -1;}//2、创建共享内存int shmid;if((shmid = shmget(key, 4096, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}//3、映射内存地址char *addr = shmat(shmid, NULL, 0);if(addr == (void*)-1){perror("shmat error");return -1;}printf("addr = %p\n", addr);           //输出共享内存的地址//向共享内存中写数据printf("请输入>>:");fgets(addr, SIZE, stdin);         //直接从终端获取数据到共享内存中addr[strlen(addr) - 1] = 0;//4、取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//5、删除共享内存//shmctl(shmid, IPC_RMID, NULL);return 0;
}

recv:

int main()
{//1、获取key值key_t key;if((key = ftok("./", 'k')) == -1){perror("ftok error");return -1;}//2、创建共享内存int shmid;if((shmid = shmget(key, 4096, IPC_CREAT|0664)) == -1){perror("shmget error");return -1;}//3、映射内存地址char *addr = shmat(shmid, NULL, 0);if(addr == (void*)-1){perror("shmat error");return -1;}printf("addr = %p\n", addr);           //输出共享内存的地址//读取共享内存中的内容printf("共享内存中的内容:%s\n", addr);//4、取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//5、删除共享内存//shmctl(shmid, IPC_RMID, NULL);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sklearn.preprocessing 特征编码汇总

文章目录 常见特征种类one-hot编码特征哈希(`Feature hashing`)基于统计的类别编码对循环特征的编码目标编码(Target encoding)K折目标编码(K-Fold Target encoding)用于数据分析的特征可能有多种形式,需要将其合理转化成模型能够处理的形式,特别是对非数值的特征,特征…

【学习笔记】TypeScript学习笔记1 --TypeScript中的类型

文章目录 TS总的变量类型References TS总的变量类型 备注&#xff1a; 如果一个变量设置为了any 类型之后相当于变量关闭了TS的类型检测 let d: any; d 10; d hello;//unknown表示的是未知类型&#xff0c;实际是上一个安全的any,unknown类型的变量不能直接赋值给其他变量le…

【无标题】分别通过select、多进程、多线程实现一个并发服务器

select #include<myhead.h>#define PORT 8888 //端口号 #define IP "192.168.0.100" //IP地址int main(int argc, const char *argv[]) {//1、创建用于接受连接的套接字int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror(&quo…

【react native】ScrollView的触摸事件与TouchableWithoutFeedback的点击事件冲突

需求背景 使用 ScrollView 组件实现轮播图效果&#xff0c;该轮播图可以自动向右滑动。有下面两个需求&#xff1a; &#xff08;1&#xff09;希望用户左右点击的时候&#xff0c;视图可以向左/向右滚动&#xff1b; &#xff08;2&#xff09;希望用户触摸在屏幕的时候&am…

【Linux】基于管道进行进程间通信

进程间通信 一、初识进程间通信1. 进程间通信概念2. 进程间通信分类 二、管道1. 管道概念2. 管道原理3. 匿名管道4. 匿名管道系统接口5. 管道的特性和情况6. 匿名管道的应用&#xff08;1&#xff09;命令行&#xff08;2&#xff09;进程池 7. 命名管道&#xff08;1&#xff…

shiro认证缓存信息导致:修改用户信息后立刻重新登录仍然能登录问题

问题描述 使用shiro进行权限认证并且&#xff0c;使用了shiro的缓存管理,ehcache.xml配置如下 <?xml version"1.0" encoding"UTF-8"?> <ehcache name"shiroCache"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"x…

Linux------命令行参数

目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al &#xff0c;可以查看当前文件夹下所有文件的信息&#xff0c;还有其他的如rm&#xff0c;touch等指令&#xff0c;都可以帮我们完成相应的操作。 其实运行这些…

为什么USB要转TTL

我个人理解为什么要usb转ttl&#xff0c;因为usb它为提高传输“01”数据的速度&#xff0c;USB在源数据基础上添加了一些传输协议&#xff0c;而ttl它很纯粹只会发送“01”数据。这个两个者与TCP和UDP的关系有点类似。 您的理解是正确的。USB&#xff08;Universal Serial Bus…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预…

push 本地文件到指定的 git 地址分支上,推送失败

项目场景&#xff1a; 背景&#xff1a; push 本地文件到指定的 git 地址分支上&#xff0c;推送失败 问题描述 遇到的问题&#xff1a; To https://gitee.com/aaaaaaab.git! [rejected] print -> print (non-fast-forward) error: failed to push some refs to …

C++ //练习 4.38 说明下面这条表达式的含义。

C Primer&#xff08;第5版&#xff09; 练习 4.38 练习 4.38 说明下面这条表达式的含义。 double slope static_cast<double>(j / i);环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 将j / i的结果强制转换为double型&am…

【C++】构造函数、初始化列表,析构函数,拷贝构造函数,运算符重载

注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载。 目录 注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载…

2024无参考图像的清晰度评价方法

无参考图像质量评价算法 无参考图像质量评价是指参考图像不存在的情况下&#xff0c;直接计算失真图像的视觉质量。根据无参考图像质量评价模型在计算图像视觉质量时是否需要图像的主观分数来进行训练&#xff0c;无参考图像质量评价算法可分为基于监督学习的无参考图像质量评价…

2024-02-06 TCP/UDP work

1. 画出TCP三次握手和四次挥手的示意图&#xff0c;并且总结TCP和UDP的区别 三次握手&#xff1a; 4次挥手&#xff1a; tcp/udp区别 TCP 1. 稳定&#xff0c;提供面向连接的&#xff0c;可靠的数据传输服务 2. 传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、…

IDEA 配置以及一些技巧

1. IDEA设置 1.1 设置主题 1.2 设置字体和字体大小 1.3 编辑区的字体用ctrl鼠标滚轮可以控制大小 1.4 自动导包和优化多余的包 1.5 设置编码方式 1.6 配置 maven 1.7 设置方法形参参数提示 1.8 设置控制台的字体和大小 注意&#xff1a;设置控制台字体和大小后需要重启IDEA才会…

C++服务器开发(3):创建服务器主循环

在C中创建服务器主循环可以使用多种方式实现&#xff0c;其中一种常见的方式是使用socket编程库&#xff0c;如Boost.Asio。 #include <iostream> #include <boost/asio.hpp>using namespace boost::asio; using namespace boost::asio::ip;int main() {try {// 创…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…

黑名单管理

文章目录 一、黑名单的基本概念二、名单管理对比三、黑名单管理的三个阶段3.1 分散管理3.2 统一管理3.3 组件化管理 四、黑名单来源4.1 外部名单4.2 内部名单 五、黑名单-名单标准 一、黑名单的基本概念 1、黑名单&#xff1a;应该被惩治或有嫌疑而被注意者的秘密名单。 2、银…

Nginx-Ingress如何配置qps限制

背景 从网上找了各种资料&#xff0c;都没说清楚如何配置k8s上的nginx-ingress的qps 试了n小时之后&#xff0c;搞定了。如下&#xff1a; 步骤 第一步&#xff1a;找到你的value.yaml文件 第二步&#xff1a;里面有个 controller.config 配置&#xff0c;增加一个 http-sn…

【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 命名空间 命名空间的定义 命名空间的使用 命名空间的嵌套使用 C输入&输出 std命名空间的使用惯例&…