为什么stat()返回EFAULT?

时间:2014-02-07 08:08:18

标签: c named-pipes stat errno mkfifo

我正在编写一个程序,当从两个单独的bash会话作为两个单独的进程运行时,在两个进程之间打开一个命名管道,以允许字符串从一个发送到另一个。

当首次从一个终端执行该过程时,它会检查stat(fname, buf) == -1以查看路径fname中的文件是否存在,如果不存在,则创建该文件。然后,该过程假定由于它是制作FIFO的那个,它将通过它发送消息并相应地继续。

在此之后,程序可以从另一个终端运行,该终端应通过检查stat(fname, buf) == -1确定它将成为通过管道的消息接收者。条件现在应该返回false,stat(fname, buf)本身应该返回0,因为现在fname存在一个文件。

但由于我无法辨别的原因,当第二个进程运行时,stat(fname, buf)仍会返回-1。变量errno设置为EFAULTman的{​​{1}}页面仅将stat()描述为“错误地址”。任何帮助确定错误发生的原因或“错误地址”的含义。非常感激。

我已经验证该文件确实是由第一个进程按预期创建的。第一个进程在第EFAULT行等待,因为它在pipe = open(fname, O_WRONLY);的另一端打开之前无法继续。

编辑:以下是我的代码的自包含实现。我已经确认它编译并经历了我在这里描述的问题。

pipe

3 个答案:

答案 0 :(得分:3)

你有这段代码:

struct stat* buf;
...
if (((!pitcher && !catcher && stat(fname, buf) == -1)

当你致电stat()时,buf没有被初始化,也没有告诉它指向的是什么。

您必须为其分配一些存储空间,因此stat()具有存储结果的有效位置。 最简单的方法就是将其分配到堆栈中:

struct stat buf;
...
if (((!pitcher && !catcher && stat(fname, &buf) == -1)

答案 1 :(得分:0)

您尚未显示代码,但EFAULT表示“地址错误”。这表示您没有为stat或文件名(fname)正确分配(或传递)缓冲区。

答案 2 :(得分:0)

buf未在任何地方初始化。你到底想要发生什么?