我正在编写一个程序,当从两个单独的bash会话作为两个单独的进程运行时,在两个进程之间打开一个命名管道,以允许字符串从一个发送到另一个。
当首次从一个终端执行该过程时,它会检查stat(fname, buf) == -1
以查看路径fname
中的文件是否存在,如果不存在,则创建该文件。然后,该过程假定由于它是制作FIFO
的那个,它将通过它发送消息并相应地继续。
在此之后,程序可以从另一个终端运行,该终端应通过检查stat(fname, buf) == -1
确定它将成为通过管道的消息接收者。条件现在应该返回false,stat(fname, buf)
本身应该返回0
,因为现在fname
存在一个文件。
但由于我无法辨别的原因,当第二个进程运行时,stat(fname, buf)
仍会返回-1
。变量errno
设置为EFAULT
。 man
的{{1}}页面仅将stat()
描述为“错误地址”。任何帮助确定错误发生的原因或“错误地址”的含义。非常感激。
我已经验证该文件确实是由第一个进程按预期创建的。第一个进程在第EFAULT
行等待,因为它在pipe = open(fname, O_WRONLY);
的另一端打开之前无法继续。
编辑:以下是我的代码的自包含实现。我已经确认它编译并经历了我在这里描述的问题。
pipe
答案 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
未在任何地方初始化。你到底想要发生什么?