【发布时间】:2010-03-16 21:37:54
【问题描述】:
我有一个任务,我需要在头文件中声明一个管道。我真的不知道该怎么做。这可能是一个非常愚蠢的问题,我可能会遗漏一些明显的东西。如果您能指出我正确的方向,我将不胜感激。
感谢您的宝贵时间。
编辑:
很抱歉这个问题太含糊了。也许我需要加强我对管道的理解。
我正在尝试在两个子进程之间创建一个管道。一个孩子将随机字符写入管道,而另一个孩子将从管道中读取字符。
我想我真的不明白当我写这样的东西时会发生什么:
int fd[2];
pipe = pipe(fd);
我是否正确地说管道的写入和读取文件描述符分别放入fd[0]和fd[1]?如果在其中一个子进程中我关闭了fd[1],那么该子进程可以被认为是我的作者,对吗?
编辑 2:
好的,看起来我几乎已经弄清楚并完成了所有事情,除了我收到与文件描述符有关的错误。
我的代码如下所示:(这只是与管道有关的代码)
proj2.h
extern int fd[2];
proj2.c
int fd[2];
pipe(fd);
writer.c
close(fd[0]);
result = write(fd[1], &writeBuffer, sizeof(writeBuffer));
if(result < 0){
perror("Write");
}
reader.c
close(fd[1]);
result = read(fd[0], &readBuffer, sizeof(readBuffer))
if(result < 0){
perror("Read");
}
执行代码后,每次 read() 和 write() 迭代都会出现错误,并显示错误“文件描述符错误”。我已经尝试在网上搜索自己来解决这个问题,但我认为我对这个材料了解得不够多,无法做到这一点。任何方向将再次不胜感激。到目前为止,所有做出贡献的人都做得很好,非常感谢。另外,如果看起来我只是让你为我做作业,那么我就是在付出诚实的努力,这并不是任务的全部。
编辑 3:
write() 系统调用是否写入标准输出?如果我只想在阅读器从管道中读取内容后打印内容怎么办?如何将它们写入管道而不将它们写入标准输出?
编辑 4: 我现在已经想通了。感谢大家的帮助。我唯一仍然好奇的是我是否能以某种方式获得父进程的状态。我已经使用 wait() 系统调用从子进程中收集了状态,并且想知道如何检索父进程的状态。
【问题讨论】:
-
您需要更清楚、更详细地解释您的问题。
-
@Kyle:你认为应该在标题中声明什么:文件描述符或系统调用?你了解
extern对变量的使用吗(在前一种情况下是必要的)?你为什么相信?你知道上下文函数中声明和定义的区别吗(后一种情况需要)? -
@Kyle for Edit 3: write() 调用将文件描述符作为其第一个参数,该参数指示输出写入的位置。文件描述符 1 是标准输出,因此 write(1, "hello") 将写入标准输出。但是,如果您在 pipe() 返回的数组中提供第二个文件描述符,您将写入管道而不写入标准输出。看一下我在下面发布的代码作为示例。鉴于您提出的问题,我认为您会从阅读 UNIX 系统编程书籍中受益(我推荐 Robbins & Robbins 的书)。
-
安德鲁,非常感谢您的意见,非常有用。我一定会看看那本 UNIX 系统编程书。