0725,进程间传递文件描述符,socketpair + sendmsg/recvmsg

我要碎掉了我要碎掉了我要碎掉了

上课喵:

pipe匿名管道的问题

#include <func.h>int main()
{int fds[2];pipe(fds);pid_t pid=fork();if(pid>0){ //fatherclose(fds[0]);//close readint fd=open("file2.txt",O_RDONLY);printf("father: fds[1]:%d\n",fds[1]);write(fds[1],&fd,sizeof(fd));wait(NULL);close(fd);}else{   //sonclose(fds[1]);//close erint chilfd=-1;read(fds[0],&chilfd,sizeof(chilfd));  //read baba pipeprintf("chilefd %d.fds [0]:%d\n",chilfd,fds[0]);char buff[100]={0};read(chilfd,buff,sizeof(buff));printf("buff  %s.\n",buff);}return 0;
}

writev

#include <func.h>
#include <sys/uio.h>int main()
{char buff[]="love";char buff2[]="xixi";int fd=open("file2.txt",O_RDWR|O_CREAT,0664);if(fd==-1){};struct iovec iov[2];iov[0].iov_base=buff;iov[0].iov_len=strlen(buff);iov[1].iov_base=buff2;iov[1].iov_len=strlen(buff2);int ret=writev(fd,iov,2);printf("ret :%d \n",ret);close(fd);return 0;
}

readv

#include <func.h>
#include <sys/uio.h>int main()
{char buff[6]={0};char buff2[6]={0};int fd=open("file2.txt",O_RDWR);if(fd==-1){};struct iovec iov[2];iov[0].iov_base=buff;/* iov[0].iov_len=strlen(buff); */iov[0].iov_len=sizeof(buff);iov[1].iov_base=buff2;iov[1].iov_len=sizeof(buff2);int ret=readv(fd,iov,2);printf("ret :%d \n",ret);printf("buff:%s \n",buff);printf("buff2:%s \n",buff2);close(fd);return 0;
}

结构体struct msghdr的发送和接收实现

真是酣畅淋漓的CP

代码改好了!!
./wr33: sendmsg: Bad file descriptor
嘿嘿~~~因为没有文件所以打开失败了!!!聪明小辉

#include <func.h>
#include <sys/uio.h>int sendFd(int pipefd,int fd){//buid 2 groupchar buff[6]="hellp";struct iovec iov;memset(&iov,0,sizeof(iov));iov.iov_base=buff;iov.iov_len=sizeof(buff);//build 3 groupint len=CMSG_LEN(sizeof(fd));struct cmsghdr* cmsg=(struct cmsghdr*)calloc(1,len);cmsg->cmsg_len=len;cmsg->cmsg_level=SOL_SOCKET;cmsg->cmsg_type=SCM_RIGHTS;int * p=(int*)CMSG_DATA(cmsg);*p=fd;// buid msghdrstruct msghdr msg;memset(&msg,0,sizeof(msg));msg.msg_iov=&iov;msg.msg_iovlen=1;msg.msg_control=cmsg;//传递文件描述msg.msg_controllen=len;int ret=sendmsg(pipefd,&msg,0);printf("sendmsg ret: %d\n",ret);if(ret==-1){error(1,errno,"sendmsg");}free(cmsg);return 0;
}int recvFd(int pipefd,int *pfd){//buid 2 groupchar buff[6]={0};struct iovec iov;memset(&iov,0,sizeof(iov));iov.iov_base=buff;iov.iov_len=sizeof(buff);//3 groupint len=CMSG_LEN(sizeof(int));struct cmsghdr* cmsg=(struct cmsghdr*)calloc(1,len);cmsg->cmsg_len=len;cmsg->cmsg_level=SOL_SOCKET;cmsg->cmsg_type=SCM_RIGHTS;struct msghdr msg;memset(&msg,0,sizeof(msg));msg.msg_iov=&iov;msg.msg_iovlen=1;msg.msg_control=cmsg;//传递文件描述符msg.msg_controllen=len;int ret =recvmsg(pipefd,&msg,0);if(ret==-1){error(1,errno,"recvmsg");}int* p=(int*)CMSG_DATA(cmsg);printf("buff: %s\n",buff);*pfd=*p;//传给外籍的指针(读取文件描述符的值)return 0;
}int main()
{int fds[2];socketpair(AF_LOCAL,SOCK_STREAM,0,fds);pid_t pid=fork();if(pid>0){ //fatherclose(fds[0]);//close readint fd=open("file1.txt",O_RDONLY);printf("father fd:%d\n",fd);/* write(fds[1],&fd,sizeof(fd)); */sendFd(fds[1],fd);wait(NULL);close(fd);}else{   //sonclose(fds[1]);//close erint chilfd=-1;/* read(fds[0],&chilfd,sizeof(chilfd));  //read baba pipe */recvFd(fds[0],&chilfd);printf("chilefd %d.fds [0]:%d\n",chilfd,fds[0]);char buff[100]={0};read(chilfd,buff,sizeof(buff));printf("buff  %s.\n",buff);}return 0;
}

 进程池框架的搭建

作业:

01:参考我们上课的代码: 让子进程A打开一个文件, 把这个文件描述符信息发给父进程B, 让父进程B在这个文件上能写一个字符串. 

好像没什么用??????

#include <func.h>
#include <sys/uio.h>int sendFd(int pipefd,int fd){//buid 2 groupchar buff[6]={0};struct iovec iov;memset(&iov,0,sizeof(iov));iov.iov_base=buff;iov.iov_len=sizeof(buff);//build 3 groupint len=CMSG_LEN(sizeof(fd));struct cmsghdr* cmsg=(struct cmsghdr*)calloc(1,len);cmsg->cmsg_len=len;cmsg->cmsg_level=SOL_SOCKET;cmsg->cmsg_type=SCM_RIGHTS;int * p=(int*)CMSG_DATA(cmsg);*p=fd;// buid msghdrstruct msghdr msg;memset(&msg,0,sizeof(msg));msg.msg_iov=&iov;msg.msg_iovlen=1;msg.msg_control=cmsg;//传递文件描述msg.msg_controllen=len;int ret=sendmsg(pipefd,&msg,0);if(ret==-1){error(1,errno,"sendmsg");}free(cmsg);return 0;
}int recvFd(int pipefd,int *pfd){//buid 2 groupchar buff[6]={0};struct iovec iov;memset(&iov,0,sizeof(iov));iov.iov_base=buff;iov.iov_len=sizeof(buff);//3 groupint len=CMSG_LEN(sizeof(int));struct cmsghdr* cmsg=(struct cmsghdr*)calloc(1,len);cmsg->cmsg_len=len;cmsg->cmsg_level=SOL_SOCKET;cmsg->cmsg_type=SCM_RIGHTS;struct msghdr msg;memset(&msg,0,sizeof(msg));msg.msg_iov=&iov;msg.msg_iovlen=1;msg.msg_control=cmsg;//传递文件描述符msg.msg_controllen=len;int ret =recvmsg(pipefd,&msg,0);if(ret==-1){error(1,errno,"recvmsg");}int* p=(int*)CMSG_DATA(cmsg);*pfd=*p;//传给外籍的指针(读取文件描述符的值)return 0;
}int main()
{int fd[2];int err=socketpair(AF_LOCAL,SOCK_STREAM,0,fd);if(err==-1){error(1,errno,"sockpair");}int pid=fork();switch (pid){case -1:error(1,errno,"fork");break;case 0:{close(fd[0]);printf("child process:%d\n",getpid());int pfd;recvFd(fd[1],&pfd);char buff[]="我恨你我恨你我恨你!!!!!\n";write(pfd,buff,sizeof(buff));close(pfd);break;}default:{close(fd[1]);int filefd=open("file2.txt",O_RDWR);if(filefd==-1){error(1,errno,"open");}sendFd(fd[0],filefd);break;}      }return 0;
}

所以那狗东西要怎么打印出来可恶!!!! 

02:仿照我们上课写的进程池, 自己手写(不要直接复制)一个进程池代码。

抄抄抄:

02:使用select编写聊天室程序:客户端和服务端使用tcp通信;服务端可以处理新客户端的连接和转发消息;客户端可以连入服务端并发送消息。

哥们发现少一个右括号直接傻眼了喵
xiaohuichen@xiaohuichen-virtual-machine:~/001/724$ cat douqusi.c
#include <func.h>
#define IP1  "192.168.235.128"
#define PORT1 8080int main()
{struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT1);addr.sin_addr.s_addr=inet_addr(IP1);int lifd=socket(AF_INET,SOCK_STREAM,0);bind(lifd,(struct sockaddr *)&addr,sizeof(struct sockaddr));listen(lifd,100);int ac_fd[1000];int ac_num=0;char buf[256];char buf_sent[256];fd_set readfds;FD_ZERO(&readfds);int fd_max;FD_SET(lifd,&readfds);fd_max=lifd;fd_set old_fds=readfds;printf("listenning\n");while(1){readfds=old_fds;select (fd_max+1,&readfds,NULL,NULL,NULL);if(FD_ISSET(lifd,&readfds)){ac_fd[ac_num]=accept(lifd,NULL,NULL);FD_SET(ac_fd[ac_num],&old_fds);if(ac_fd[ac_num]>fd_max){fd_max=ac_fd[ac_num];}ac_num++;printf("welcome user%d \n",ac_fd[ac_num-1]);}for(int i=0;i<ac_num;i++){if(FD_ISSET(ac_fd[i],&readfds)){int a=recv(ac_fd[i],buf,256,0);if(a==0){close(ac_fd[i]);}}sprintf(buf_sent,"user%d:%s",ac_fd[i],buf);for(int j=0;j<ac_num;j++){send(ac_fd[j],buf_sent,strlen(buf_sent)+1,0);}}}return 0;
}

HTTP:(咳咳,是我不知道怎么跑然后连了一个客户端喵)

#include <func.h>
#define IP1  "192.168.235.128"
#define PORT1 8080struct sockaddr* addr_create(const char* ip,int  port ){struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));memset(addr,0,sizeof(*addr));addr->sin_family=AF_INET;addr->sin_port=htons(port);addr->sin_addr.s_addr=inet_addr(ip);return (struct sockaddr*)addr;
}int main()
{int sofd=socket(AF_INET,SOCK_STREAM,0);if(sofd==-1){error(1,errno,"socket");}int on=1;int ret=setsockopt(sofd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));if(ret==-1){error(1,errno,"setsoclopt");}struct sockaddr* addr=addr_create(IP1,PORT1);ret=bind(sofd,addr,sizeof(*addr));if(ret==-1){error(1,errno,"bind");}ret=listen(sofd,1);while(1){int peerfd=accept(sofd,NULL,NULL);char buff[4096]={0};ret=recv(peerfd,buff,sizeof(buff),0);printf("\nrecv: %d.bytes \n",ret);printf("----%s\n",buff);char response[4096]={0};const char* start_line="HTTP/1.1 200 ok\r\n";const char* headers="Server:MyHttpServer1.0\r\n""Connection:keep-aliave\r\n""Conntent-Type:text/html\r\n""Content-Length:";const char* empty_line="\r\n";const char* body="<html><head>This is a test</head><body>hello,client</body></html>";sprintf(response,"%s%s%ld\r\n%s%s",start_line,headers,strlen(body),empty_line,body);send(peerfd,response,strlen(response),0);}close(sofd);return 0;
}

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

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

相关文章

如何安全的申请SSL证书

随着数字化时代的快速发展&#xff0c;互联网政务应用已成为政府服务民众、提升治理效能的重要途径。在这个网络日益复杂的时代&#xff0c;政务网站的安全问题显得尤为重要。2024年&#xff0c;国家出台并从2024年7月1日开始实施执行《互联网政务应用安全管理规定》&#xff0…

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性&#xff0c;子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性&#xff0c;具有继承性。代码如下&a…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

Matlab编程资源库(7)图形修饰处理

一、视点处理 MATLAB 提供了 设置视点 的函数 view &#xff0c;其调用格式 为&#xff1a; view(az,el) 其中 az 为 方位角 &#xff0c; el 为 仰角 &#xff0c;它们均以度为单位。 系统缺省的视点定义为方位角-37.5 , 仰角30 。 二、色彩处理 1 &#xff0e;颜色的向量…

【前端学习】CSS三大特性

CSS三大特性 CSS的三大特性是为了化简代码、定位问题并且解决问题 继承性 继承性特点&#xff1a; 子级默认继承父级的文字控制属性。注意&#xff1a;如果标签自己有样式则生效自己的样式&#xff0c;不继承。 <!DOCTYPE html> <html lang"en"><…

windows USB 设备驱动开发- WinUSB 简介

WinUSB 是 Windows 随附的 USB 设备的通用驱动程序。WinUSB 包括&#xff1a; 内核模式驱动程序 (Winusb.sys)&#xff1b;公开 winusb.h 中所述的 WinUSB 函数的用户模式动态链接库 (Winusb.dll)。 借助这些函数&#xff0c;你可以使用用户模式软件管理 USB 设备&#xff1b;…

12 位运算符

位运算符只能用于整数&#xff0c;其内部执行过程为&#xff1a;首先将整数转换为二进制数&#xff0c;然后右对齐&#xff0c;必要时左侧补0&#xff0c;按位进行运算&#xff0c;最后再把计算结果转换为十进制数字返回。 ① 左移&#xff1a;高位丢弃&#xff0c;低位补0&…

Exponential Moving Average (EMA) in Stable Diffusion

1.Moving Average in Stable Diffusion (SMA&EMA) 1.Moving average 2.移动平均值 3.How We Trained Stable Diffusion for Less than $50k (Part 3) Moving Average 在统计学中&#xff0c;移动平均是通过创建整个数据集中不同选择的一系列平均值来分析数据点的计算。 …

数据结构与算法-插入排序

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、插入排…

unity ui toolkit的使用

UIToolkitExamples (github)样例 GitHub - ikewada/UIToolkitExamples: チュートリアル動画「使ってみようUI Toolkit」のためのサンプルプロジェクトです官网 Unity - Manual: UI Toolkit视频教程 使用 UI Toolkit - 上集_哔哩哔哩_bilibili 使用 UI Toolkit - 下集_哔哩哔哩_…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

赋能未来教育,3DCAT助力深圳鹏程技师学院打造5G+XR实训室

随着国家对教育行业的重视&#xff0c;实训室建设已成为推动教育现代化的关键。《教育信息化2.0行动计划》、《职业教育示范性虚拟仿真实训基地建设指南》等政策文件&#xff0c;明确指出了加强虚拟仿真实训教学环境建设的重要性。 在这一大背景下&#xff0c;教育行业对于实训…

初识C++ · AVL树(1)

目录 前言&#xff1a; 1 AVL树的创建 2 部分成员函数 2.1 查找 2.2 中序遍历 2.3 插入 2.4 左旋转 2.5右旋转 前言&#xff1a; 上文&#xff0c;上上文提到了map set&#xff0c;二叉搜索树&#xff0c;其实都是为了近两文做铺垫的&#xff0c;虽然map的底层是红黑树…

openFeign配置okhttp

原来的项目出现了性能问题&#xff0c;老大不知道怎么的&#xff0c;让我改openFeign线程池为okhttp&#xff0c;说原生的不支持线程池性能比较差。 原openFeign配置文章地址 一、pom文件 <dependency><groupId>org.springframework.cloud</groupId><arti…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的跳格子游戏(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring&#xff0c;先搞配置文件&#xff0c;并配置bean 创建我们需要的类&#xff0c;beandefito&#xff0c;这个类是用来装解析后的bean&#xff0c;主要三个字段&#xff0c;id&#xff0c;class&#xff0c;scop&#xff0c;对应xml配置的属性 package org…

第二讲:NJ网络配置

Ethernet/IP网络拓扑结构 一. NJ EtherNet/IP 1、网络端口位置 NJ的CPU上面有两个RJ45的网络接口,其中一个是EtherNet/IP网络端口(另一个是EtherCAT的网络端口) 2、网络作用 如图所示,EtherNet/IP网络既可以做控制器与控制器之间的通信,也可以实现与上位机系统的对接通…

MySQL --- 表的操作

在对表进行操作时&#xff0c;需要先选定操作的表所在的数据库&#xff0c;即先执行 use 数据库名; 一、创建表 create table 表名( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a…

从零入门 AI for Science(AI+药物) #Datawhale AI 夏令营

使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset 主要操作 运行实例&#xff0c;如果有时长尽量选择方式二&#xff08;以下操作基于方式二的实例实现&#xff09; 创建文件夹&#xff0c;并重命名为 2.3siRNA 上传两个文件 到文件夹&#…

BGP路由反射器

原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割原则&#xff0c;该原则的根本作用是防止 AS内部的BGP路由环路。因此&#xff0c;在AS内部&#xff0c;一般需要每台…