gpt4 book ai didi

c - 管道在c中是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 18:44:39 25 4
gpt4 key购买 nike

所以我有两个关于 c 中管道的问题:

1:

当我在创建管道后 fork 一个进程以使父进程写入管道而子进程从中读取时,它是如何同步的? :父级总是在子级尝试读取数据之前发送数据,尽管它们是同时运行的? 为什么我不考虑 child 在 parent 尝试发送数据之前开始阅读的情况?

2:

这是关于管道的文件描述符,请引用下面的代码当子进程还没有访问该文件时,父进程如何关闭管道输出文件描述符? ,假设父级首先开始。

如有任何帮助,我们将不胜感激,谢谢!

#include <stdio.h>                                                                                 
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

#define BUFFER_SIZE 256

int main(int argc , char*argv[])
{
pid_t worker_pid ;
int descriptor[2];
unsigned char bufferR[256] , bufferW[256];

/***************************** create pipe ********************/

puts("pipe creation");
if (pipe(descriptor) !=0)
{
fprintf(stderr,"error in the pipe");
exit(1);
}

/***************************** create processes ********************/

puts("now fork processes");
worker_pid = fork(); // fork process
if (worker_pid == -1 ) // error forking processes
{
fprintf(stderr,"error in fork");
exit(2);
}


/*********************** communicate processes ********************/

if (worker_pid == 0) // in the child process : the reader
{
close(descriptor[1]); // close input file descriptor , ok because parent finished writing
read(descriptor[0],bufferR,BUFFER_SIZE);
printf("i'm the child process and i read : %s \n",bufferR);
}


if (worker_pid !=0)
{
// is there any case where child attempts to read before parent writting ?
close(descriptor[0]);// close file descriptor of child before it reads ?
sprintf(bufferW,"i'm the parent process my id is %d , and i wrote this to my child",getpid());
write(descriptor[1],bufferW,BUFFER_SIZE);
wait(NULL);
}
return 0;
}

我预计在某些情况下问题 1 的输出为:我是子进程,我读到:

because the parent doesn't wrote it's message yet

对于问题 2,我预计会出现错误:

invalid file descriptor in the child process because the parent already closed it (assuming the parent runs always the first)

但实际输出始终是:我是子进程,我读到:我是父进程,我的 id 是 7589,我把这个写给我的 child

最佳答案

When i fork a process after creating a pipe in order to make the parent write to the pipe and the child read from it, How it's synchronized ? : the parent always send data before the child attempts to read that data although they are running concurrently? why i don't fall on the case where the child start reading before the parent try to send its data ?

通常,它不需要进行同步,事实上它本身可以充当同步机制。如果您执行阻塞读取(默认),那么无论初始读取和写入调用的相对顺序如何,它们都将在发送相应数据之前完成。

然而,这两个过程确实需要实现适当的机制来划分和识别消息边界,以便读者能够识别短读并做出适当的响应。这可能就像用换行符结束每条消息一样简单,然后使用 fgets() 读取消息(通过通过 fdopen() 获得的流)。

This is about file descriptors of the pipe, referring to the code below how can parent-process close the pipe-output file-descriptor while the child doesn't access to that file yet ? , assuming the parent starts first.

不是问题。一旦子进程被 fork ,它就可以通过父进程可以使用的相同文件描述符编号来访问从其父进程继承的底层打开文件描述,但这些文件描述符与父进程是分开的,以便确定每次打开的次数引用文件描述。这种情况与 dup() 系统调用操作所产生的情况类似。仅当所有进程关闭所有给定打开文件描述的文件描述符时,该打开文件描述才会失效。

关于c - 管道在c中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307901/

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