进程间通信

不要回答!不要回答!不要回答!

管道

管道命令

在linux下创建pipe命令为|,可以进行进程间通信,它是进程间的一个单向数据流,一个写入一个读取。

1
ls | more

第一个进程的标准输出被重定向到管道中;第二个进程从这个管道中读取输入。管道可以看作一个打开的文件。

管道工作过程

系统调用

pipe

pipe的头文件和函数原型如下:

1
2
#include<unistd.h>
int pipe(int filedes[2]);

输入为一个文件描述符数组,大小为2,保存两个文件描述符:

  • filedes[0]:管道读取端,一般为3
  • filedes[1]:管道写入端,一般为4

所以linux下的管道实际上是半双工的。如果创建管道失败,返回-1,否则返回0

管道的一些属性

大小

管道的大小不同的机器可能不同,下面是一个测试的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
test $# -ge 1 || { echo "usage: $0 write-size [wait-time]"; exit 1; }
test $# -ge 2 || set -- "$@" 1
bytes_written=$(
{
exec 3>&1
{
perl -e '
$size = $ARGV[0];
$block = q(a) x $size;
$num_written = 0;
sub report { print STDERR $num_written * $size, qq(\n); }
report; while (defined syswrite STDOUT, $block) {
$num_written++; report;
}
' "$1" 2>&3
} | (sleep "$2"; exec 0<&-);
} | tail -1
)
printf "write size: %10d; bytes successfully before error: %d\n" \
"$1" "$bytes_written"

输入测试命令:

1
/bin/bash -c 'for p in {0..18}; do ts.sh $((2 ** $p)) 0.5; done'

在我这里是65536个byte。

参考文献

0%