0%

Linux函数学习(二)—— pipe 函数

pipe 函数

管道是一种两个进程间进行单向通信的机制;因为管道传递数据的单向性,管道又称为半双工管道。

Linux 进程间通讯方式:

  1. 管道(pipe)和有名管道(fifo)
  2. 消息队列
  3. 共享内存
  4. 信号量
  5. 信号(signal)
  6. 套接字(sicket)

头文件

1
#include <unistd.h>

函数原型

1
int pipe(int fd[2]);

返回值:

1
2
1.  0,成功。
2. -1,失败。

功能

创建一个简单的管道,若成功则为数组 fd 分配两个文件描述符,其中 fd[0] 用于读取管道fd[1] 用于写入管道

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc ,char *argv[])
{
int pipefd[2],result;
char buf[1024];
int exitFlag = 0;
pid_t fpid;

result = pipe(pipefd); // 创建一个管道 (pipefd[0]:用于读取管道 ;pipefd[1]:用于写入管道)
if(-1 == result)
{
perror("创建管道失败: ");
exit(EXIT_FAILURE);
}

fpid = fork(); // 创建一个子进程
if(-1 == fpid) // 创建进程失败
{
perror("创建新进程失败: ");
exit(EXIT_FAILURE);
}
else if(0 == fpid) // 子进程 (设置只读)
{
if(-1 == (close(pipefd[1])))
{
perror("关闭可写管道失败: ");
exit(EXIT_FAILURE);
}
while(1) //循环读取数据
{
read(pipefd[0], buf, 1024); //最多读取1024个字节
fprintf(stdout, "读取到内容:%s\n", buf);
if(0 == strcmp(buf, "exit")) // 如果读取到的字符串是 ‘exit’ ;这时,父进程会接受到一个终止进程的信号,父进程会回收子进程的资源等
{
exit(EXIT_SUCCESS);
}
}
}
else // 父进程 (设置只写)
{
if(-1 == (close(pipefd[0])))
{
perror("关闭可读管道失败: ");
exit(EXIT_FAILURE);
}
while(1) //循环写入内容
{
waitpid(fpid, NULL, WNOHANG); // 等待子进程退出

if(1 == exitFlag)
{
exit(EXIT_SUCCESS);
}
scanf("%s", buf);
write(pipefd[1], buf, strlen(buf) + 1); // 具体写多少个字节
if(0 == strcmp(buf, "exit"))
{
exitFlag = 1;
sleep(1); // 睡一会,让子进程完全退出。
}
}
}
return 1;
}

运行结果

1
2
3
4
5
进程间通信
读取到内容:进程间通信
exit
读取到内容:exit
Program ended with exit code: 0

Demo