这是我在做一个课程项目时发现的。 下面是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手册页我没有这样的声明。
如果您的根本问题是如何判断管道的背部是否连接,则有两个答案:
如果管道的另一端连接,选项2将会出现问题。 如果你能够创建一个永远不会被作者发送的消息被读者拒绝,你可以解决它。