pipe

Posted by Humb1e on 2023-05-06
Estimated Reading Time 2 Minutes
Words 623 In Total
Viewed Times

pipe

mainly from pipe() 系统调用 - GeeksforGeeks

从概念上讲,管道是两个进程之间的连接,使得一个进程的标准输出成为另一个进程的标准输入。在 UNIX 操作系统中,管道对于相关进程之间的通信(进程间通信)很有用。

  • 管道只是单向通信,即我们可以使用管道,使得一个进程写入管道,另一个进程从管道读取。它打开一个管道,这是被视为**“虚拟文件”**的主内存区域。

  • 创建进程及其所有子进程可以使用管道进行读取和写入。一个进程可以写入此“虚拟文件”或管道,另一个相关进程可以从中读取。

  • 如果进程在将某些内容写入管道之前尝试读取,则该进程将挂起,直到写入某些内容。

  • 管道系统调用查找进程的打开文件表中的前两个可用位置,并将它们分配给管道的读取端和写入端。

    img

pipe和fork联合

mainly from C 程序演示 fork() 和 pipe() - GeeksforGeeks

fork和pipe联合可以实现

fork一个子进程,然后子进程向管道里写一些东西,父进程从管道里读。

下面的code实现了一个类似于strcat的方法:

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
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
//define pipe
int fd_parent[2];
int fd_child[2];
char first_str[] = "humb1e";
char second_str[]="hacked_by_";
pid_t p;
//check if create successfully
if (pipe(fd_parent) == -1) {
fprintf(stderr, "Pipe Failed");
return 1;
}
if (pipe(fd_child) == -1) {
fprintf(stderr, "Pipe Failed");
return 1;
}
p = fork();
if (p < 0) {
fprintf(stderr, "fork Failed");
return 1;
}
// Parent process
else if (p > 0) {
char concat_str[100];

close(fd_parent[0]); // Close reading end of first pipe

// Write input string and close writing end of first
// pipe.
write(fd_parent[1], second_str, strlen(second_str) + 1);
close(fd_parent[1]);

// Wait for child to send a string
wait(NULL);

close(fd_child[1]); // Close writing end of second pipe

// Read string from child, print it and close
// reading end.
read(fd_child[0], concat_str, 100);
printf("Concatenated string:%s\n", concat_str);
close(fd_child[0]);
}

// child process
else {
close(fd_parent[1]); // Close writing end of first pipe

// Read a string using first pipe
char concat_str[100];
read(fd_parent[0], concat_str, 100);

// Concatenate a fixed string with it
int k = strlen(concat_str);
int i;
for (i = 0; i < strlen(first_str); i++)
concat_str[k++] = first_str[i];

concat_str[k] = '\0'; // string ends with '\0'

// Close both reading ends
close(fd_parent[0]);
close(fd_child[0]);

// Write concatenated string and close writing end
write(fd_child[1], concat_str, strlen(concat_str) + 1);
close(fd_child[1]);

exit(0);
}
return 0;
}

运行结果:

1
Concatenated string:hacked_by_humb1e

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !