硬链接到空pipelinux vs unix的数量

这是我在做一个课程项目时发现的。 下面是C代码块,用于打印尚未连接到任何进程的空pipe信息。

{ int pfd[2], nread; char s[100]; struct stat pipe_info; if (pipe(pfd) == -1) { perror ("pipe"); return (-1); } if (fstat (pfd[0], &pipe_info) < 0) perror ("fstat"); print_info (&pipe_info); if (fstat (pfd[1], &pipe_info) < 0) perror ("fstat"); print_info (&pipe_info); return(0); } void print_info (struct stat *pipe_info) { printf ("mode %o\n", pipe_info->st_mode); printf ("inode %d\n", pipe_info->st_ino); printf ("device %d\n", pipe_info->st_dev); printf ("minor device %d\n", pipe_info->st_rdev); printf ("num links %d\n", pipe_info->st_nlink); printf ("uid %d\n", pipe_info->st_uid); printf ("gid %d\n", pipe_info->st_gid); printf ("size %d\n", pipe_info->st_size); printf ("atime %d\n", pipe_info->st_atime); printf ("mtime %d\n", pipe_info->st_mtime); printf ("ctime %d\n", pipe_info->st_ctime); printf ("block size %d\n", pipe_info->st_blksize); printf ("block %d\n", pipe_info->st_blocks); } 

我在Linux机器和Solaris OS机器上编译了源代码。 我发现在Linux机器上,链接的数量是1,而在Solaris操作系统的机器上,pipe道的链接数量是0.我对两个系统的内核都比较陌生,想知道为什么两个系统上的链接数量是不同的?

SunOS 5.10 / Solaris 2.x手册对st_nlink字段进行了说明:

st_nlink该字段只能由管理命令使用。

我读为“这个领域有一个无意义的价值”。

相反,Linux的价值是有道理的:管道有一个链接到创建它的过程。 我希望st_nlink等于2,一旦对方被连接到(叉)过程。 Linux fstat声称POSIX遵从性很好。 Solaris手册页我没有这样的声明。

如果您的根本问题是如何判断管道的背部是否连接,则有两个答案:

  1. 你的程序应该知道它是否附加在后面
  2. 您可以尝试写入管道并获得EAGAIN,EWOULDBLOCK,EPIPE或SIGPIPE信号的某种组合。

如果管道的另一端连接,选项2将会出现问题。 如果你能够创建一个永远不会被作者发送的消息被读者拒绝,你可以解决它。