⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000015.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;struct&nbsp;msghdr&nbsp;msg;&nbsp;&nbsp;<BR>&nbsp;char&nbsp;&nbsp;&nbsp;buf[2];&nbsp;/*&nbsp;send_fd()/recv_fd()&nbsp;2-byte&nbsp;protocol&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;iov[0].iov_base&nbsp;=&nbsp;buf;&nbsp;&nbsp;<BR>&nbsp;iov[0].iov_len&nbsp;&nbsp;=&nbsp;2;&nbsp;&nbsp;<BR>&nbsp;msg.msg_iov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;iov;&nbsp;&nbsp;<BR>&nbsp;msg.msg_iovlen&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;<BR>&nbsp;msg.msg_name&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NULL;&nbsp;&nbsp;<BR>&nbsp;msg.msg_namelen&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(fd&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrights&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NULL;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrightslen&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;-fd;&nbsp;/*&nbsp;nonzero&nbsp;status&nbsp;means&nbsp;error&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(buf[1]&nbsp;==&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;1;&nbsp;/*&nbsp;-256,&nbsp;etc.&nbsp;would&nbsp;screw&nbsp;up&nbsp;protocol&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrights&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(caddr_t)&nbsp;&amp;fd;&nbsp;/*&nbsp;addr&nbsp;of&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrightslen&nbsp;=&nbsp;sizeof(int);&nbsp;&nbsp;/*&nbsp;pass&nbsp;1&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;0;&nbsp;&nbsp;/*&nbsp;zero&nbsp;status&nbsp;means&nbsp;OK&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;}&nbsp;&nbsp;<BR>&nbsp;buf[0]&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;/*&nbsp;null&nbsp;byte&nbsp;flag&nbsp;to&nbsp;recv_fd()&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(sendmsg(clifd,&nbsp;&amp;msg,&nbsp;0)&nbsp;!=&nbsp;2)&nbsp;&nbsp;<BR>&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;return(0);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>程序15.7&nbsp;&nbsp;4.3BDS下的send_fd函数&nbsp;&nbsp;<BR>在sendnisg调用中,发送双字节协议数据(null和status字节)和描述符。&nbsp;&nbsp;<BR>为了接收一文件描述符,我们从流管道读,直至读到null字节,它位于最后的sta&nbsp;&nbsp;<BR>tus字节之前。在此null字节之前的是一条出错消息,它来自发送者。这示于程序&nbsp;&nbsp;<BR>15.8。&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/socket.h&gt;&nbsp;&nbsp;/*&nbsp;struct&nbsp;msghdr&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/uio.h&gt;&nbsp;&nbsp;&nbsp;/*&nbsp;struct&nbsp;iovec&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&lt;stddef.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&quot;ourhdr.h&quot;&nbsp;&nbsp;<BR>/*&nbsp;Receive&nbsp;a&nbsp;file&nbsp;descriptor&nbsp;from&nbsp;another&nbsp;process&nbsp;(a&nbsp;server).&nbsp;&nbsp;<BR>&nbsp;*&nbsp;In&nbsp;addition,&nbsp;any&nbsp;data&nbsp;received&nbsp;from&nbsp;the&nbsp;server&nbsp;is&nbsp;passed&nbsp;&nbsp;<BR>&nbsp;*&nbsp;to&nbsp;(*userfunc)(STDERR_FILENO,&nbsp;buf,&nbsp;nbytes).&nbsp;&nbsp;We&nbsp;have&nbsp;a&nbsp;&nbsp;<BR>&nbsp;*&nbsp;2-byte&nbsp;protocol&nbsp;for&nbsp;receiving&nbsp;the&nbsp;fd&nbsp;from&nbsp;send_fd().&nbsp;*/&nbsp;&nbsp;<BR>int&nbsp;&nbsp;<BR>recv_fd(int&nbsp;servfd,&nbsp;ssize_t&nbsp;(*userfunc)(int,&nbsp;const&nbsp;void&nbsp;*,&nbsp;size_t))&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;newfd,&nbsp;nread,&nbsp;status;&nbsp;&nbsp;<BR>&nbsp;char&nbsp;&nbsp;&nbsp;*ptr,&nbsp;buf[MAXLINE];&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;iovec&nbsp;iov[1];&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;msghdr&nbsp;msg;&nbsp;&nbsp;<BR>&nbsp;status&nbsp;=&nbsp;-1;&nbsp;&nbsp;<BR>&nbsp;for&nbsp;(&nbsp;;&nbsp;;&nbsp;)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;iov[0].iov_base&nbsp;=&nbsp;buf;&nbsp;&nbsp;<BR>&nbsp;&nbsp;iov[0].iov_len&nbsp;&nbsp;=&nbsp;sizeof(buf);&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_iov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;iov;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_iovlen&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_name&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NULL;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_namelen&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrights&nbsp;=&nbsp;(caddr_t)&nbsp;&amp;newfd;/*&nbsp;addr&nbsp;of&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_accrightslen&nbsp;=&nbsp;sizeof(int);&nbsp;&nbsp;/*&nbsp;receive&nbsp;1&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(&nbsp;(nread&nbsp;=&nbsp;recvmsg(servfd,&nbsp;&amp;msg,&nbsp;0))&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;err_sys(&quot;recvmsg&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;else&nbsp;if&nbsp;(nread&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;err_ret(&quot;connection&nbsp;closed&nbsp;by&nbsp;server&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;/*&nbsp;See&nbsp;if&nbsp;this&nbsp;is&nbsp;the&nbsp;final&nbsp;data&nbsp;with&nbsp;null&nbsp;&amp;&nbsp;status.&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Null&nbsp;must&nbsp;be&nbsp;next&nbsp;to&nbsp;last&nbsp;byte&nbsp;of&nbsp;buffer,&nbsp;status&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;is&nbsp;last&nbsp;byte.&nbsp;&nbsp;Zero&nbsp;status&nbsp;means&nbsp;there&nbsp;must&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;a&nbsp;file&nbsp;descriptor&nbsp;to&nbsp;receive.&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;for&nbsp;(ptr&nbsp;=&nbsp;buf;&nbsp;ptr&nbsp;&lt;&nbsp;&amp;buf[nread];&nbsp;)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if&nbsp;(*ptr++&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr&nbsp;!=&nbsp;&amp;buf[nread-1])&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_dump(&quot;message&nbsp;format&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;*ptr&nbsp;&amp;&nbsp;255;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(status&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(msg.msg_accrightslen&nbsp;!=&nbsp;sizeof(int))&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_dump(&quot;status&nbsp;=&nbsp;0&nbsp;but&nbsp;no&nbsp;fd&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;newfd&nbsp;=&nbsp;the&nbsp;new&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newfd&nbsp;=&nbsp;-status;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;nread&nbsp;-=&nbsp;2;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(nread&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if&nbsp;((*userfunc)(STDERR_FILENO,&nbsp;buf,&nbsp;nread)&nbsp;!=&nbsp;nread)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(status&nbsp;&gt;=&nbsp;0)&nbsp;/*&nbsp;final&nbsp;data&nbsp;has&nbsp;arrived&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return(newfd);&nbsp;/*&nbsp;descriptor,&nbsp;or&nbsp;-status&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;}&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>程序15.8&nbsp;&nbsp;4.3BSD下的recv_fd函数&nbsp;&nbsp;<BR>注意,该程序总是准备接收一描述符(在每次调用recvmsg之前,设置msg_accrig&nbsp;&nbsp;<BR>hts和msg_accrightslen&nbsp;),但是仅当在返回时msg_accrightslen非0,我们才确实&nbsp;&nbsp;<BR>接收到一描述符。&nbsp;&nbsp;<BR>15.3.3&nbsp;4.3+BSD&nbsp;&nbsp;<BR>从4.3BSD&nbsp;Reno开始,更改了msghdr结构的定义。在以前版本中被称之为&quot;存取权&quot;&nbsp;&nbsp;<BR>的最后两个元素改称为&quot;辅助数据&quot;。另外,在该结构结束处增加了一个新成员msg&nbsp;&nbsp;<BR>_flags。&nbsp;&nbsp;<BR>strcut&nbsp;msghdr&nbsp;{&nbsp;&nbsp;<BR>&nbsp;caddr_t&nbsp;&nbsp;msg_name;&nbsp;&nbsp;&nbsp;&nbsp;可选的地址&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;msg_namelen;&nbsp;&nbsp;&nbsp;&nbsp;地址长度&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;iovec&nbsp;&nbsp;msg_iov;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;散布/聚集数组&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;msg_iovlen;&nbsp;&nbsp;&nbsp;&nbsp;在msg_iov数组中的元素数&nbsp;&nbsp;<BR>&nbsp;caddr_t&nbsp;&nbsp;msg_control;&nbsp;&nbsp;&nbsp;&nbsp;辅助数据&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;msg-controllen;&nbsp;&nbsp;&nbsp;辅助数据的长度&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;msg_flags;&nbsp;&nbsp;&nbsp;&nbsp;接收到消息的标志&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>现在,msg_control字段指向一个cmsghdr(控制消息头)结构。&nbsp;&nbsp;<BR>struct&nbsp;cmsghdr&nbsp;{&nbsp;&nbsp;<BR>&nbsp;u_int&nbsp;cmsg_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据的字节数,包括头&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;cmsg_level;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始的协议&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;cmsg_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;协议细节的类型&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下接真正的控制消息数据&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>为了发送一文件描述符,将cmsg_len设置为cmsghdr结构长度加一个整型(描述符&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>)的长度。将cmsg_level设置为SOL_SOCKET,cmsg_type设置为SCM_RIGHTS,这表明&nbsp;&nbsp;<BR>正在传送的是存取权。(&quot;SCM&quot;表示套接口级控制消息,&quot;socket-level&nbsp;control&nbsp;&nbsp;<BR>message&quot;。)实际描述符的存放位置紧随cmsy_type字段之后,使用CMSG_DATA宏以&nbsp;&nbsp;<BR>获得指向该整型数的指针。程序15.9示出了4.3BSD&nbsp;Reno之下的send_fd函数。&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/socket.h&gt;&nbsp;&nbsp;/*&nbsp;struct&nbsp;msghdr&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/uio.h&gt;&nbsp;&nbsp;&nbsp;/*&nbsp;struct&nbsp;iovec&nbsp;*/&nbsp;&nbsp;<BR>#include&nbsp;&lt;errno.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&lt;stddef.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&quot;ourhdr.h&quot;&nbsp;&nbsp;<BR>static&nbsp;struct&nbsp;cmsghdr&nbsp;*cmptr&nbsp;=&nbsp;NULL;&nbsp;/*&nbsp;buffer&nbsp;is&nbsp;malloc'ed&nbsp;first&nbsp;time&nbsp;&nbsp;<BR>*/&nbsp;&nbsp;<BR>#define&nbsp;CONTROLLEN&nbsp;(sizeof(struct&nbsp;cmsghdr)&nbsp;+&nbsp;sizeof(int))&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;size&nbsp;of&nbsp;control&nbsp;buffer&nbsp;to&nbsp;send/recv&nbsp;one&nbsp;file&nbsp;descriptor&nbsp;*/&nbsp;&nbsp;<BR>/*&nbsp;Pass&nbsp;a&nbsp;file&nbsp;descriptor&nbsp;to&nbsp;another&nbsp;process.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;If&nbsp;fd&lt;0,&nbsp;then&nbsp;-fd&nbsp;is&nbsp;sent&nbsp;back&nbsp;instead&nbsp;as&nbsp;the&nbsp;error&nbsp;status.&nbsp;*/&nbsp;&nbsp;<BR>int&nbsp;&nbsp;<BR>send_fd(int&nbsp;clifd,&nbsp;int&nbsp;fd)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;iovec&nbsp;iov[1];&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;msghdr&nbsp;msg;&nbsp;&nbsp;<BR>&nbsp;char&nbsp;&nbsp;&nbsp;buf[2];&nbsp;/*&nbsp;send_fd()/recv_fd()&nbsp;2-byte&nbsp;protocol&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;iov[0].iov_base&nbsp;=&nbsp;buf;&nbsp;&nbsp;<BR>&nbsp;iov[0].iov_len&nbsp;&nbsp;=&nbsp;2;&nbsp;&nbsp;<BR>&nbsp;msg.msg_iov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;iov;&nbsp;&nbsp;<BR>&nbsp;msg.msg_iovlen&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;<BR>&nbsp;msg.msg_name&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NULL;&nbsp;&nbsp;<BR>&nbsp;msg.msg_namelen&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(fd&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_control&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NULL;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_controllen&nbsp;=&nbsp;0;&nbsp;&nbsp;<BR>&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;-fd;&nbsp;/*&nbsp;nonzero&nbsp;status&nbsp;means&nbsp;error&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(buf[1]&nbsp;==&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;1;&nbsp;/*&nbsp;-256,&nbsp;etc.&nbsp;would&nbsp;screw&nbsp;up&nbsp;protocol&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(cmptr&nbsp;==&nbsp;NULL&nbsp;&amp;&amp;&nbsp;(cmptr&nbsp;=&nbsp;malloc(CONTROLLEN))&nbsp;==&nbsp;NULL)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;&nbsp;cmptr-&gt;cmsg_level&nbsp;&nbsp;=&nbsp;SOL_SOCKET;&nbsp;&nbsp;<BR>&nbsp;&nbsp;cmptr-&gt;cmsg_type&nbsp;&nbsp;&nbsp;=&nbsp;SCM_RIGHTS;&nbsp;&nbsp;<BR>&nbsp;&nbsp;cmptr-&gt;cmsg_len&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;CONTROLLEN;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_control&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(caddr_t)&nbsp;cmptr;&nbsp;&nbsp;<BR>&nbsp;&nbsp;msg.msg_controllen&nbsp;=&nbsp;CONTROLLEN;&nbsp;&nbsp;<BR>&nbsp;&nbsp;*(int&nbsp;*)CMSG_DATA(cmptr)&nbsp;=&nbsp;fd;&nbsp;&nbsp;/*&nbsp;the&nbsp;fd&nbsp;to&nbsp;pass&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;0;&nbsp;&nbsp;/*&nbsp;zero&nbsp;status&nbsp;means&nbsp;OK&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;}&nbsp;&nbsp;<BR>&nbsp;buf[0]&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;/*&nbsp;null&nbsp;byte&nbsp;flag&nbsp;to&nbsp;recv_fd()&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(sendmsg(clifd,&nbsp;&amp;msg,&nbsp;0)&nbsp;!=&nbsp;2)&nbsp;&nbsp;<BR>&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;return(0);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>程序15.9&nbsp;&nbsp;4.3BSD之下的send_fd函数&nbsp;&nbsp;<BR>为了接收一描述符(程序15.10),我们为cmsghdr结构和一描述符分配足够的存储&nbsp;&nbsp;<BR>区,设置msg_control使其指向所分配到的存储区,然后调用recvmsg。&nbsp;&nbsp;<BR>#include&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -