LINUX中文件描述符传递

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;} </style> </head> <body> <div> <h1><span style="font-family:宋体;mso-ascii-font-family:" times="" new="" roman";="" mso-hansi-font-family:"times="" roman""="">进程间传递文件描述符</span> </h1> <div style="line-height: 150%"><span times="" new="" roman";="" mso-hansi-font-family:"times="" roman""=""> <table style="font-family: 宋体; table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: rgb(234, 242, 211); line-height: 150%"> <tbody style="line-height: 150%"> <tr style="line-height: 150%"> <td style="line-height: 150%"><span style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "> <p class="MsoNormal" style="line-height: 150%"><span times="" new="" roman";="" mso-hansi-font-family:"times="" roman""="" style="font-weight: bold; font-size: 12pt; font-family: 宋体; ">第一步:初始化</span><span lang="EN-US"><span style="font-family: Consolas; font-size: 13.5pt"><strong>socketpair</strong></span></span><span times="" new="" roman";mso-hansi-font-family:="" "times="" roman""="" style="font-weight: bold; font-size: 12pt; font-family: 宋体; ">类型描述符(管道,全双工)</span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="font-family: Consolas; font-size: 13.5pt; background-color: rgb(255, 255, 0); "><span times="" new="" roman";mso-hansi-font-family:="" "times="" roman""="">#include &lt;sys/types.h&gt;&nbsp;</span></span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="font-family: Consolas; font-size: 13.5pt; background-color: rgb(255, 255, 0); "><span times="" new="" roman";mso-hansi-font-family:="" "times="" roman""="">#include &lt;sys/socket.h&gt;</span></span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="font-family: Consolas; background-color: rgb(255, 255, 0); font-size: large; ">int socketpair(int domain, int type, int protocol, int sv\[2\]);</span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="font-family: Consolas; background-color: rgb(255, 255, 0); font-size: large; "><br /></span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="font-family: Consolas; color: rgb(0, 0, 255); "><span lang="EN-US"><strong style="font-size: 12pt; ">int fds\[2\]; &nbsp;</strong><span style="font-size: 10pt"><strong> </strong><span style="background-color: rgb(0, 255, 255);">//和无名管道不一样,无名管道只能用于父子进程之间,现在我们要用于网络;</span></span></span></span> </p> <p class="MsoNormal" style="line-height: 100%"><span style="color: rgb(0, 0, 255); font-family: Consolas; font-size: medium; "><strong>socketpair(AF\_LOCAL,SOCK\_STREAM,0,fds); &nbsp;</strong> //local,是因为控制信息只能在本地传</span> </p></span> </td> <td style="line-height: 150%"><span style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "> <p class="MsoNormal" style="line-height: 150%"><span style="font-weight: bold; font-size: 12pt; font-family: 宋体; ">第二步</span><span style="font-weight: bold; font-size: 12pt; font-family: 宋体; ">:</span><span lang="EN-US"><span style="font-family: Consolas; font-size: 13.5pt"><strong>sendmsg</strong></span></span><span style="font-weight: bold; font-size: 12pt; font-family: 宋体; ">发送描述符</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman', serif; "><o:p></o:p></span> </p> <p class="MsoNormal" style="line-height: 150%"><span style="font-family: Consolas"><span lang="EN-US" style="font-size: large; "><span style="background-color: rgb(255, 255, 0); ">ssize\_t <strong>sendmsg</strong>(int sockfd,&nbsp;</span><span style="background-color: rgb(0, 255, 0); ">const struct msghdr</span><span style="background-color: rgb(255, 255, 0); ">&nbsp;\*msg, int flags);</span><o:p></o:p></span><span style="font-size: large; border-collapse: collapse; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">&nbsp; &nbsp;&nbsp;</span></span> </p> <p class="MsoNormal" style="line-height: 150%"><span style="font-family: Consolas"><span style="border-collapse: collapse; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; background-color: rgb(234, 242, 211); "><span style="color: #0000ff; font-size: 12pt">//内核控制信息传递接口,可以传递文件描述符</span></span></span> </p> <p class="MsoNormal" style="line-height: 150%"><span style="font-family: Consolas; font-size: 13.5pt"><span lang="EN-US"><span style="color: #ff0000"><strong>sockfd&nbsp;</strong></span></span><span times="" new="" roman";mso-hansi-font-family:="" "times="" roman""="">即</span><span lang="EN-US">sockpair</span><span times="" new="" roman";mso-hansi-font-family:="" "times="" roman""="">初始化的描述符&nbsp;</span></span><span lang="EN-US"><span style="font-family: Consolas; font-size: 13.5pt">fds\[1\];</span></span> </p></span> </td> </tr> </tbody> </table><br /> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: #EAF2D3; line-height: 150%"> <tbody style="line-height: 150%"> <tr style="line-height: 150%"> <td style="line-height: 150%; background-color: #ffffff"> <div style="line-height: 150%"><span style="font-family: Consolas"><span style="color: #0000ff; font-size: medium; "><strong><br /></strong></span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas"><span style="color: #0000ff; font-size: medium; "><strong>1).定义结构体</strong></span><span style="font-size: 12pt">&nbsp;</span><span style="font-size: 13.5pt"> <strong style="background-color: rgb(0, 255, 0); ">struct msghdr msg;</strong></span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">sendmsg 关键是初始化 &nbsp;msghdr结构体</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt"> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: #EAF2D3; line-height: 150%"> <tbody style="line-height: 150%"> <tr style="line-height: 150%"> <td style="background-color: rgb(192, 192, 192); line-height: 150%"> <div style="line-height: 150%"> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">struct <strong>msghdr</strong></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas; font-size: 10pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp;void&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; \*msg\_name; &nbsp; </span><span style="font-family: Consolas; font-size: 10pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* optional address \*/&nbsp; 没用</span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></span><span style="font-size: 12pt; background-color: rgb(192, 192, 192);">socklen\_t&nbsp; &nbsp;&nbsp; msg\_namelen; &nbsp; </span><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* size of address \*/ 没用</span></span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt; background-color: rgb(192, 192, 192); ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="background-color: rgb(192, 192, 192);"><span style="font-size: 12pt">&nbsp;<span style="color: #0000ff"> </span></span><span style="font-size: 12pt"><span style="color: #0000ff">struct iovec</span></span><span style="font-size: 12pt"><span style="color: #0000ff"> \*msg\_iov; </span>&nbsp; &nbsp;</span></span><span style="font-size: 10pt; background-color: rgb(192, 192, 192); ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* scatter/gather array \*/ 没用</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt; background-color: rgb(192, 192, 192); ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="background-color: rgb(192, 192, 192);"><span style="font-size: 10pt">&nbsp;</span><span style="font-size: 12pt">&nbsp; </span><span style="font-size: 12pt"><span style="color: #0000ff">s</span></span></span><span style="font-size: 12pt; background-color: rgb(192, 192, 192); "><span style="color: #0000ff">ize\_t&nbsp; &nbsp; &nbsp; &nbsp; msg\_iovlen;</span> &nbsp; &nbsp;</span><span style="font-size: 10pt; background-color: rgb(192, 192, 192); "><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* # elements in msg\_iov \*/ </span><span style="color: #ff0000; background-color: rgb(192, 192, 192); ">没用,写这个就是为了随便传一些数据,告诉内核我们要写数据,只是一个校验,不能不写</span></span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></span><span style="background-color: rgb(192, 192, 192);"><span style="font-size: 12pt">&nbsp;<strong>&nbsp; </strong></span><span style="font-size: 12pt; color: #0000ff"><strong>void</strong></span><span style="font-size: 12pt"><strong><span style="color: #0000ff">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; \*msg\_control</span>;</strong> </span></span><span style="background-color: rgb(192, 192, 192); "><span style="font-size: 10pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="background-color: rgb(192, 192, 192); "><span style="font-size: 12pt">/\* ancillary data, see below \*/ 关键,即下面的&nbsp;</span></span><span style="color: #ff0000; background-color: rgb(192, 192, 192); ; font-size: 12pt"><strong>cmsghdr&nbsp;</strong>结构体地址,告诉内核我们要传递哪一个结构体,只是一个指针,用的时候要malloc一个空间给他(CMSG\_LEN)</span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></span><span style="font-size: 12pt; background-color: rgb(192, 192, 192);">&nbsp;&nbsp;<span style="color: #0000ff"> size\_t&nbsp; &nbsp; &nbsp; &nbsp; msg\_controllen; </span>&nbsp; &nbsp;</span><span style="background-color: rgb(192, 192, 192); "><span style="font-size: 10pt">&nbsp; &nbsp;&nbsp;</span><span style="font-size: 12pt">/\* ancillary data buffer len \*/&nbsp;<span style="color: #ff0000"><strong>cmsghdr</strong>结构体的长度</span>,</span></span><span style="color: #ff0000; background-color: rgb(192, 192, 192); ; font-size: 12pt">前面是void\*,所以这里只能是字节</span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></span><span style="font-size: 12pt; background-color: rgb(192, 192, 192);">&nbsp;&nbsp; int&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; msg\_flags;</span><span style="font-size: 10pt"><span style="background-color: rgb(192, 192, 192);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* flags (unused) \*/ 没用</span></span></span> </div> <div style="background-color: rgb(192, 192, 192); line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </div> </td> </tr> <tr style="line-height: 150%"> <td style="background-color: #ffcc99; line-height: 150%"> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">struct iovec</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void&nbsp; \*iov\_base;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; /\* Starting address \*/起始地址</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size\_t iov\_len; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* Number of bytes to transfer \*/要写的长度</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> </tr> <tr style="line-height: 150%"> <td style="background-color: #ffff99; line-height: 150%"> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">struct cmsghdr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000">//控制信息结构体(这是一个变长结构体,自己的长度在自己的成员里记录着)</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; socklen\_t cmsg\_len; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/\* data byte count, including header \*/ &nbsp;<span style="color: #ff0000">记录自己这个结构体的长度</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; int&nbsp; &nbsp; &nbsp;&nbsp; cmsg\_level; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/\* originating protocol \*/</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; int&nbsp; &nbsp; &nbsp;&nbsp; cmsg\_type; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /\* protocol-specific type \*/</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; /\* followed by unsigned char cmsg\_data\[\]; \*/ &nbsp; &nbsp; <span style="color: #ff0000">//通过CMSG\_DATA获取这个成员的首地址,我们到时候只往这里放fd,告诉内核我们要传fd</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> </tr> </tbody> </table></span> </div> </td> </tr> <tr style="line-height: 150%"> <td style="line-height: 150%"> <div style="line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 13.5pt"><span style="background-color: rgb(255, 255, 0);">unsigned char \*CMSG\_DATA(</span><span style="background-color: rgb(0, 255, 0);">struct cmsghdr</span><span style="background-color: rgb(255, 255, 0);"> \*cmsg);</span></span><span style="font-size: 12pt">&nbsp; &nbsp; //把结构体传进去,返回要写入信息的首地址(待会要里面放fd(一个整形数)),也就是最后一块空间的首地址,最后面<span style="color: #0000ff"><strong>/\*...\*/</strong></span>中要放的信息</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas"><span style="font-size: 13.5pt; background-color: rgb(255, 255, 0);">size\_t CMSG\_LEN(size\_t length);</span><span style="font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //得出变长结构体大小16字节(这个是针对我们后面例子,传描述符,我们自己算的),待会分配空间要用到(前面三个成员指针3\*4,最后一个int型,一共16)</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">//这个接口的原理就是拿到我们要传递的参数的大小length,进去加上12,返回16</span> </div> </td> </tr> <tr style="line-height: 150%"> <td style="line-height: 150%"> <div style="line-height: 150%"> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt"><span style="color: #0000ff"><br /></span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt"><span style="color: #0000ff">首先定义&nbsp;</span> struct cmsghdr \*cmsg 指针</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt"><span style="color: rgb(255, 0, 0); ">cmsg\_len</span>&nbsp;中存取cmsghdr结构体的长度,通过CMSG\_LEN进行计算,我们传递的fd的大小为整型四个字节,所以</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt"><br /></span> </div> <div style="line-height: 150%"> </div> <div style="line-height: 150%"><span style="font-size: 12pt; background-color: rgb(255, 255, 0); "><span style="font-family: Consolas">size\_t CMSG\_LEN(size\_t length);</span></span> </div> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt">int&nbsp;<span style="color: rgb(255, 0, 0); ">len</span>&nbsp;= CMSG\_LEN(sizeof(int));(16字节)</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas"><br /></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; font-size: 12pt; color: #0000ff">然后为结构体申请空间:</span> </div> <div style="line-height: 150%"> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: #EAF2D3; line-height: 150%"> <tbody style="line-height: 150%"> <tr style="line-height: 150%"> <td style="background-color: #ccffff; line-height: 150%"> <div style="line-height: 150%"><span style="font-size: 12pt"><span style="font-family: Consolas; color: #000000">cmsg = (struct cmsghdr \*)calloc(1,</span><span style="font-family: Consolas; color: #ff0000">len</span><span style="font-family: Consolas; color: #000000">);</span></span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt">cmsg-&gt;cmsg\_len = len;</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt">cmsg-&gt;cmsg\_level =SOL\_SOCKET;</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt">cmsg-&gt;cmsg\_type = SCM\_RIGHTS;</span> </div> </td> <td style="background-color: #ccffff; line-height: 150%"> <div style="background-color: rgb(204, 255, 255); line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt">int \*fdptr;</span> </div> <div style="line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt"><span style="background-color: rgb(204, 255, 255);">fdptr= (int \*) </span><strong style="background-color: rgb(255, 255, 0);">CMSG\_DATA</strong><span style="background-color: rgb(204, 255, 255);">(cmsg);</span></span> </div> <div style="background-color: rgb(204, 255, 255); line-height: 150%"><span style="font-family: Consolas; color: #000000; font-size: 12pt">\*fdptr = fd;</span> </div> </td> </tr> </tbody> </table> </div> </td> </tr> </tbody> </table> <table style="font-family: 微软雅黑; font-size: 10pt; border-collapse: collapse; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: gray; border-right-color: gray; border-bottom-color: gray; border-left-color: gray; border-width: initial; border-top-width: 2px; border-right-width: 0px; border-bottom-width: 2px; border-left-width: 0px; table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: rgb(234, 242, 211); line-height: 19px"> <tbody style="line-height: 19px; "> <tr style="line-height: 19px; "> <td style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: gray; border-right-color: gray; border-bottom-color: gray; border-left-color: gray; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; line-height: 19px; background-color: #c0c0c0"> <div style="line-height: 26px; "><span style="font-family: Consolas; font-size: 13.5pt; background-color: rgb(255, 255, 0); ">#include&lt;sys/uio.h&gt;</span> </div> <div style="line-height: 26px; "><span style="font-family: Consolas; font-size: 13.5pt; background-color: rgb(255, 255, 0); ">ssize\_t&nbsp; readv(int fd,&nbsp; const&nbsp; struct&nbsp; iovec&nbsp; \*iov, int&nbsp; iovcnt);</span> </div> <div style="line-height: 26px; "><br /> </div> </td> <td style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: gray; border-right-color: gray; border-bottom-color: gray; border-left-color: gray; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; line-height: 26px; background-color: #c0c0c0"><span style="font-family: Consolas"><span style="font-size: large; background-color: rgb(255, 255, 0); ">ssize\_t&nbsp; writev(int fd,&nbsp; const&nbsp; struct&nbsp; iovec&nbsp; \*iov, int&nbsp; iovcnt);</span><br /><span style="color: #0000ff; font-size: 12pt">//这个函数可以传多个结构体,第二个数要传的结构体指针,第三个是要传的结构体个数<br /></span></span> </td> </tr> </tbody> </table><span style="border-collapse: collapse; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br /></span> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color:#EAF2D3;"> <tbody> <tr> <td style="background-color: #ffffff"><span style="font-family: 宋体; font-size: 12pt"><strong>第三步:recvmsg 接收文件描述符,接收的 msghdr 结构体初始化和 sendmsg 几乎完全一致,<span style="color: #0000ff">区别如下:</span></strong></span><span style="font-family: Consolas"><span style="font-size: 13.5pt; background-color: rgb(248, 248, 248); "><br /></span><span style="font-size: 13.5pt; background-color: rgb(255, 255, 0); ">ssize\_t recvmsg(int sockfd, struct msghdr \*msg, int flags); &nbsp;&nbsp;</span><span style="font-size: 12pt"><span style="color: #0000ff">//内核控制信息传递接口,可以接受文件描述符</span><br />fd = \*fdptr;</span></span> </td> </tr> </tbody> </table></span> </div> </div> <div> <p class="MsoNormal" style="font-family: 宋体; font-size: small; "> </p> <p class="MsoNormal"><br /> </p> </div> <div><span style="font-size: 12pt"> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color: #EAF2D3"> <tbody> <tr> <td> <div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;stdio.h&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;stdlib.h&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;string.h&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;sys/uio.h&gt;&nbsp; &nbsp; &nbsp; &nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;sys/stat.h&gt;&nbsp; &nbsp; &nbsp; &nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;sys/types.h&gt;&nbsp; &nbsp; &nbsp;&nbsp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;fcntl.h&gt;</span> </div> </div> <div><span style="font-family: Consolas; font-size: 12pt"><img src="data:image/png;base64,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" /></span> </div> </td> <td> <div> <div><span style="font-family: Consolas; font-size: 12pt">int main()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000"><strong style="background-color: rgb(234, 242, 211);"> int fd=open(&quot;file1&quot;,O\_RDWR);</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf1\[10\]=&quot;hello &quot;;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf2\[10\]=&quot;world\\n&quot;;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000; background-color: rgb(0, 255, 255); "><strong>struct iovec iov\[2\];</strong></span></span> </div> <div><span style="color: #ff0000; font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_base=buf1;</span> </div> <div><span style="color: #ff0000; font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_len=strlen(buf1);</span> </div> <div><span style="color: #ff0000; font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_base=buf2;</span> </div> <div><span style="color: #ff0000; font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_len=strlen(buf2);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000"><strong> int ret=writev(fd ,iov,2);&nbsp; &nbsp; &nbsp;</strong></span><span style="color: #ff0000">if(-1==ret)&nbsp; { perror(&quot;writev&quot;); return -1; }</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt; color: #0000ff">//如果fd没有被赋值打开的文件描述符,这里传参默认0;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">}</span> </div> </div> </td> </tr> </tbody> </table></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: Consolas; font-size: 13.5pt; background-color: rgb(0, 255, 255);">man cmsg</span> </div> <div> </div> <div><span style="font-size: 12pt"> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color:#EAF2D3;"> <tbody> <tr> <td><span style="font-family: Consolas; font-size: 13.5pt; color: #0000ff"><strong>func.h</strong></span> </td> <td><span style="font-family: Consolas; font-size: 12pt"><br /></span> </td> <td><span style="font-family: Consolas; font-size: 12pt"><br /></span> </td> <td><span style="font-family: Consolas; font-size: 12pt"><br /></span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;sys/types.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;sys/socket.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;netinet/in.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;arpa/inet.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;unistd.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;string.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;stdio.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;stdlib.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;sys/epoll.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;sys/stat.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;fcntl.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include &lt;sys/uio.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><br /></span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">void send\_fd(int fds,int fd)</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp;<span style="color: #ff0000"> &nbsp; <strong>&nbsp; struct msghdr msg;</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; memset(&amp;msg,0,sizeof(msg));</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; <span style="color: #ff0000">&nbsp; &nbsp; &nbsp; struct iovec iov\[2\];</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf1\[10\]=&quot;hello&quot;;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf2\[10\]=&quot;world&quot;;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_base=buf1;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_len=5;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_base=buf2;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_len=5;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp;<span style="color: #ff0000"> &nbsp; &nbsp; msg.msg\_iov=iov;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">&nbsp; &nbsp; &nbsp; &nbsp; msg.msg\_iovlen=2;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000"><br /></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; <span style="color: #ff0000"><strong>&nbsp; &nbsp; struct cmsghdr\* cmsg;</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000"> &nbsp; int len=CMSG\_LEN(sizeof(int));</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000">cmsg=(struct cmsghdr\*)calloc(1,len);</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; cmsg-&gt;cmsg\_len=len;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; cmsg-&gt;cmsg\_level=SOL\_SOCKET;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; cmsg-&gt;cmsg\_type=SCM\_RIGHTS;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><br /></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000"><strong> \*(int\*)CMSG\_DATA(cmsg)=fd;</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000">msg.msg\_control=cmsg;</span></span><span style="color: #ff0000"></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">&nbsp; &nbsp; &nbsp; &nbsp; msg.msg\_controllen=len;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp;<span style="color: #ff0000"><strong> &nbsp; &nbsp; int ret=sendmsg(fds,&amp;msg,0);&nbsp; &nbsp;</strong></span> &nbsp; &nbsp; </span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; if(-1==ret)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror(&quot;sendmsg&quot;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">}</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">void recv\_fd(int fds,int\* pfd)</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<strong> &nbsp;<span style="color: #ff0000"> struct msghdr msg;</span></strong></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; memset(&amp;msg,0,sizeof(msg));</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000"> &nbsp; struct iovec iov\[2\];</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf1\[10\]={0};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; char buf2\[10\]={0};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_base=buf1;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[0\].iov\_len=5;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_base=buf2; <span style="color: #0000ff">//这里是收不到对端发来的数据的,但是必须要写</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; iov\[1\].iov\_len=5;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000">msg.msg\_iov=iov;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">&nbsp; &nbsp; &nbsp; &nbsp; msg.msg\_iovlen=2;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000"><br /></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000"><strong> &nbsp; struct cmsghdr\* cmsg;</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; <span style="color: #ff0000">&nbsp; int len=CMSG\_LEN(sizeof(int));</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000"> cmsg=(struct cmsghdr\*)calloc(1,len);</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; cmsg-&gt;cmsg\_len=len;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff">cmsg-&gt;cmsg\_level=SOL\_SOCKET;</span></span><span style="color: #0000ff"></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #0000ff">&nbsp; &nbsp; &nbsp; &nbsp; cmsg-&gt;cmsg\_type=SCM\_RIGHTS;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt; color: #0000ff">//后面两个可以不写的</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000"> &nbsp; msg.msg\_control=cmsg;</span></span><span style="color: #ff0000"></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><span style="color: #ff0000">&nbsp; &nbsp; &nbsp; &nbsp; msg.msg\_controllen=len;</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; <span style="color: #ff0000"><strong>&nbsp; int ret=recvmsg(fds,&amp;msg,0);&nbsp; &nbsp; &nbsp; &nbsp; </strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; if(-1==ret)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror(&quot;recvmsg&quot;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; <span style="color: #ff0000"><strong>&nbsp; &nbsp; \*pfd=\*(int\*)CMSG\_DATA(cmsg);</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">}</span> </div> </td> <td><span style="font-family: Consolas; font-size: 12pt">#include &quot;func.h&quot;<br /></span> <div><span style="font-family: Consolas; font-size: 12pt">int main()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; int fds\[2\]; &nbsp; &nbsp; <span style="color: #ff0000">&nbsp;//全双工</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000">&nbsp; &nbsp;//pipe(fds); &nbsp; //这个管道不是前面学的无名管道</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; int ret;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000"><strong> &nbsp; ret=socketpair(AF\_LOCAL,SOCK\_STREAM,0,fds);</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; if(-1==ret)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror(&quot;socketpair&quot;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; if(!fork())</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(fds\[1\]);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int fd;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000"><strong>&nbsp; &nbsp; recv\_fd(fds\[0\],&amp;fd);</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;child fd=%d\\n&quot;,fd);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char buf\[10\]={0};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000">&nbsp; read(fd,buf,sizeof(buf));</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;buf=%s\\n&quot;,buf);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-family: Consolas; font-size: 12pt; color: #0000ff"><strong style="background-color: rgb(248, 248, 248);">close(fd);</strong></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit(0);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }else{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(fds\[0\]);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000">&nbsp; &nbsp; int fd=open(&quot;file&quot;,O\_RDWR);</span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;parent fd=%d\\n&quot;,fd);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000"><strong>&nbsp; &nbsp; &nbsp; &nbsp; send\_fd(fds\[1\],fd);</strong></span></span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><strong><span style="color: #ff0000">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff"> close(fd); //发过去,关闭,引用计数降为1</span></strong></span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait(NULL);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 0;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">}</span> </div> <div><span style="font-family: Consolas; font-size: 12pt; background-color: rgb(0, 255, 255);"><span style="color: #0000ff"><strong>//fds\[0\]和fds\[1\]都具有读写属性,但是也要关闭一端,剩下的那一端都可以读或者写。</strong></span></span> </div> </td> </tr> </tbody> </table></span> </div> <div><span style="font-size: 12pt"><br /></span> </div> <div><span style="font-size: 12pt"><img src="data:image/png;base64,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" />&nbsp; <span style="color: #0000ff">&nbsp;</span></span><span style="font-family: Consolas; font-size: 12pt; color: #0000ff">//不用管为什么父进程是3传给子进程就变成4; 描述符是操作系统内核管控的, 传递只是把控制信息给传递过去了, 不用管具体描述符数字是多少;</span> </div> <div><span style="font-size: 12pt"><br /></span> </div> <div><span style="font-size: 12pt"><br /></span> </div> <div><span style="font-size: 12pt"><br /></span> </div> <div><span style="font-size: 12pt"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> <div><span style="font-family: 宋体;"><br /></span> </div> </body> </html>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

C++面向对象实现封装线程池

<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:13.5pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px