【问题标题】:C: creating named pipe using mknod() not workingC:使用 mknod() 创建命名管道不起作用
【发布时间】:2013-05-15 07:43:29
【问题描述】:

语言:C 操作系统:Ubuntu

我只是尝试使用以下命令创建一个 FIFO 命名管道:

state = mknod("pipe.txt", S_IFIFO | 0666, 0);

问题是我总是将 state 的值设为 -1(意味着它已经失败)而不是 0。

perror 返回 'pipe.txt: 文件存在'

我不知道我应该如何调试这样的问题或可能是什么原因,希望任何人的代码指导我出了什么问题。

(注意:文件 pipe.txt 与源文件位于同一路径。)

【问题讨论】:

  • "mknod() 成功时返回零,如果发生错误则返回 -1(在这种情况下,errno 设置得当)。 errno 是什么?如果你使用perror,从一开始就很容易看到。
  • 检测到mknod()失败后使用perror("mknod: pipe.txt")
  • mkfifo这样的系统调用返回-1时,表示有错误。要获得错误,您需要查看errno。要打印errno 中错误代码的可用字符串版本,请使用strerror 获取可打印字符串,或使用perror 直接打印。但是,您应该只检查 errno iff 函数失败(即返回 -1NULL 或它指定为失败的返回值)。
  • 你对 perror 的看法是对的,我得到的错误是:'pipe.txt:文件存在'。可能是我不明白事情是如何工作的,但我认为该文件应该存在,这不是整个想法吗?
  • Popokoko,不,如果您点击我的回答 (linux.die.net/man/2/mknod) 中的链接,您会发现它应该存在。 mknod在文件系统空间中创建一个条目。

标签: c pipe mknod


【解决方案1】:

阅读:int mknod(const char *path, mode_t mode, rdev_t dev_identifier);
一般说明
使用 path 参数中指定的路径名​​创建一个新的字符特殊文件或 FIFO 特殊文件(命名管道)。

如果文件已经存在,那么它将失败并出现错误:File exists

为避免此错误,请删除(unlink())文件,正如我在下面的代码中所做的那样(阅读评论):

int main() {
  char* file="pipe.txt";
  unlink(file);  // Add before mknod()
  int state = mknod(file, S_IFIFO | 0666, 0);
  if(state < 0){
    perror("mknod() error");
  }
  return 0;
}

【讨论】:

  • 在取消链接之前确保它是你的文件:-)
  • 谢谢@Grijesh Chauhan,您的代码示例说明了这一点。我对事情的运作方式有一些误解。另外,谢谢@paxdiablo!
  • 小更新:我想我搞砸了,使用 unlink 命令后,我无法再次运行我的项目,有东西卡在后台:在构建它时说:阻塞:用户正在等待后台工作:(
  • @Popokoko 也考虑 Paxdiablo 的评论。
  • 你知道如何在后台阻止这个被阻止的问题吗?
【解决方案2】:

您应该检查errno 以查看错误是什么,但它可能是EEXIST,因为我相信如果文件已经存在就会发生这种情况。

来自Linux documentation for mknod

如果路径名已经存在,或者是符号链接,则此调用将失败并出现 EEXIST 错误。

但是,如果文件已经存在并且您在之前的运行中创建的管道,您可以安全地重新打开它。所有mknod(以及它经常首选的表亲mkfifo)所做的实际上是创建 FIFO,您仍然必须在两端打开它才能进行数据传输。

【讨论】:

  • 呃,我想我现在明白了,我很确定它应该得到一个 EXISTING 文件,虽然我知道它应该得到一个文件描述符或类似的东西
  • @Popokoko,您没有从 mknod 获得文件描述符,您只能获得 0 或 -1。您必须打开创建的fifo才能使用它。
猜你喜欢
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2012-03-11
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多