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。
运行结果如下:
有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。
dup()与dup2()能对输入文件描述符进行重定向。
函数原型如下:
dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是取系统当前可用的最小整数值。dup2和dup类似,不过它将返回第一个不小于oldfd的整数值。
dup和dup2成功返回新的文件描述符,失败则返回-1并设置errno。
运行结果如下: