gpt4 book ai didi

c - 使用 vs 不使用 C pipe() 函数 - 是什么导致了这种行为?

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:38 25 4
gpt4 key购买 nike

我写了一个简单的脚本(取自教程),它在子进程中将数据写入管道的一端,并在父进程中从管道的另一端读取数据:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
pid_t pid;
int mypipefd[2];
int ret;
char buf[20];

ret = pipe(mypipefd);

if (ret == -1) {
printf("Pipe failed.\n");
exit(1);
}

if ((pid = fork()) == -1) {
printf("Fork failed.\n");
exit(1);
} else if (pid == 0) {
printf("Child process.\n");
char msg[] = "Hello there!";
write(mypipefd[1], msg, strlen(msg) + 1);
} else {
printf("Parent process.\n");
read(mypipefd[0], buf, 15);
printf("Buf: %s\n", buf);
}

return 0;
}

这工作正常并输出我期望的结果:

Parent process.
Child process.
Buf: Hello there!
[ project ] $

然后随着我对代码越来越熟悉,我想知道为什么我们需要使用mypipefd[2]pipe()来实现这个目标,或者mypipefd[1] 本身就可以工作。所以我用下面的代码试了一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
pid_t pid;
int my_array[1];
char buf[20];

if ((pid = fork()) == -1) {
printf("Fork failed.\n");
exit(1);
} else if (pid == 0) {
printf("Child process.\n");
char msg[] = "Hello there!\n";
write(my_array[0], msg, strlen(msg) + 1);
} else {
// wait(NULL);
printf("Parent process.\n");
read(my_array[0], buf, 15);
printf("Buf: %s\n", buf);
}

return 0;
}

此代码输出相同的文本,但在完成打印后挂起。

Parent process.
Child process.
Buf: Hello there!

这次没有提示。我什至尝试取消对 wait(NULL) 的调用的注释,以防根本原因是父进程和子进程之间的冲突。没有这样的运气。

这是怎么回事?为什么在程序不挂起的情况下,我无法以这种方式读取和写入长度为 1 的数组?编译器到底卡在什么地方了?

最佳答案

无论是在计算机上还是在现实生活中,管道都有两个 端。就像现实生活中的管道一样,数据从管道的一端(写入端)流向另一端(读取端)。

pipe函数通过将它们写入两个文件描述符的数组来为您提供这两端。该对的第一个元素是只读的,第二个是只写的。

关于c - 使用 vs 不使用 C pipe() 函数 - 是什么导致了这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57069576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com