You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# carlos @ Carloss-MBP in ~/workspace/work/clab/macos/test_pipe on git:master x [14:37:49]
$ ./test.elf
/Users/carlos/workspace/work/clab/macos/test_pipe/test_pipe.c:test_pipe_rw_fork_dup:161--parent write 11 bytes: hello world
0000000 h e l l o w o r l d
0000013
Linux进程之间的通信-管道(下)
1 dup和管道函数
1.1 dup
dup函数,复制文件句柄映射,fd2 = dup(fd1):
dup2函数,fd3 = dup2(fd1, fd2):
Note, std的文件描述符总是在使用最小可用的数字,例如,关闭掉std的文件描述符,那么文件描述符就会找到除了0以外最小的描述符。如下表格,如果我们close(0)之后,stdin的文件描述符被关闭,此时管道文件描述符使用stdin。
Example:
1.2 管道和dup
这里面可以利用fd的最小可用属性可以实现fork进程之间的stdout -> stdin管道通信。这里需要注意的是:
输出:
# carlos @ Carloss-MBP in ~/workspace/work/clab/macos/test_pipe on git:master x [14:37:49] $ ./test.elf /Users/carlos/workspace/work/clab/macos/test_pipe/test_pipe.c:test_pipe_rw_fork_dup:161--parent write 11 bytes: hello world 0000000 h e l l o w o r l d 0000013
2 命名管道:FIFO
之前的管道我们可以叫做匿名管道,匿名管道有个比较重要的特点:两个进程之间必须有共同的祖先进程,也就是必须要fork或者exec才能完成管道之间的通信。为了打破这个限制,Linux提供了命名FIFO管道,允许两个毫无关系的进程相互通信,而且这种通信的传输速率还是很高的。我们在Linux命令行中可以轻易的使用命名管道FIFO。
2.1 shell中的命名管道
创建管道
$ mkfifo ./fifo
读入管道的内容
$ cat < ./fifo
此时cat命令被阻塞,因为没有任何的数据被写入管道。
写入管道内容
$ echo "Hallow world! > ./fifo"
此时在cat的命令终端就可以看到写入的数据了。
2.2 FIFO PIEP APIs
这里面的mode还是有个点说法的:
注意,在调用write和read函数对FIFO进行写读操作的时候,要注意对写进行“原子化”,每个写的长度保证小于等于PIPE_BUF(在limits.h文件中)字节,系统可以保证数据不会交错在一起,所以单次长度限制长度小于PIPE_BUF。
2.3 Example
实现两个进程之间使用FIFO管道交互:
Server : Write data
Client: Read data
The text was updated successfully, but these errors were encountered: