当前位置: 代码迷 >> 综合 >> 高级I/O函数之socketpair和dup/dup2
  详细解决方案

高级I/O函数之socketpair和dup/dup2

热度:90   发布时间:2024-01-09 17:45:23.0

1、socketpair函数

     pipe用来创建管道,但是的单个管道只能单向通信,一端进行读,另一端进行写。如果要实现进程双向通信,必须创建一对管道,而socketpair则可以用来创建双向通信的管道。

      socketpair创建了一对匿名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组。eg: s[2] 这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向s[0]中写入,就可以从s[1]中读取(只能从s[1]中读取),也可以在s[1]中写入,然后从s[0]中读取;但是,若没有在0端写入,而从1端读取,则1端的读取操作会阻塞,即使在1端写入,也不能从1读取,仍然阻塞;反之亦然。

函数原型如下:


      socketpair函数的前三个参数的含义与socket系统调用的三个参数完全相同。socketpair的特性由协议族domain、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。

-------domain:表示协议族只能使用本地域协议族,因为我们只能在本地创建双向管道,即只能为AF_LOCAL或者AF_UNIX。

-------type:表示类型,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的                 管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。

-------protocol:表示协议,必须为0。

-------sv:和pipe系统调用一样,用于保存建立的套接字对,socketpair创建的这对文件描述符都是即可读又可写的。

函数返回值:成功时返回0,失败返回-1并设置errno


运行结果如下:



2、dup/dup2函数

有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。

dup()与dup2()能对输入文件描述符进行重定向。

函数原型如下:


       dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是取系统当前可用的最小整数值。dup2和dup类似,不过它将返回第一个不小于oldfd的整数值。


        dup和dup2成功返回新的文件描述符,失败则返回-1并设置errno。

1、打开一个新文件
2、dup关掉标准输出文件符,dup2不需要这一步
3、调用dup/dup2进行文件描述符重定向
4、此时文件描述符变为1
5、将所要打印数据重定向到文件中


运行结果如下: