C 在Unix中区分管道和文件

C 在Unix中区分管道和文件,c,unix,file,pipe,manpage,C,Unix,File,Pipe,Manpage,给定一个文件*,是否可以确定基础类型?也就是说,是否有一个函数可以告诉我文件*是管道、套接字还是常规磁盘文件?有一个fstat(2)函数 名字 stat、fstat、lstat-获取文件状态 概要 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int fstat(int fd, struct stat *buf); #包括 #包括 #包括 int-f

给定一个文件*,是否可以确定基础类型?也就是说,是否有一个函数可以告诉我文件*是管道、套接字还是常规磁盘文件?

有一个
fstat(2)
函数

名字 stat、fstat、lstat-获取文件状态

概要

   #include <sys/types.h>
   #include <sys/stat.h>
   #include <unistd.h>

   int fstat(int fd, struct stat *buf);
#包括
#包括
#包括
int-fstat(int-fd,结构状态*buf);
您可以通过调用
fileno(3)
获取fd

然后您可以调用
S_ISFIFO(buf)
来计算它。

使用fstat()函数。但是,您需要使用fileno()宏从file struct获取文件描述符

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

FILE *fp = fopen(path, "r");
int fd = fileno(fp);
struct stat statbuf;

fstat(fd, &statbuf);

/* a decoding case statement would be good here */
printf("%s is file type %08o\n", path, (statbuf.st_mode & 0777000);
#包括
#包括
#包括
#包括
文件*fp=fopen(路径,“r”);
int fd=文件编号(fp);
结构stat statbuf;
fstat(fd和statbuf);
/*这里最好有一个解码案例陈述*/
printf(“%s是文件类型%08o\n”,路径,(statbuf.st_mode&0777000);

可能值得一提:
S_ISFIFO(buf.st_模式)
此宏不会为您爬网结构。这是一个很好的示例,但对于没有经验的编码人员来说,它没有意义。问答应该始终推广到基本问题,以便其他有类似问题的人可以在类似的上下文中理解答案。问题是在unix中区分管道和文件。您的答案只是演示如何解析统计模式。这是一个很好的示例,您没有正确回答问题。此问题的答案是
FILE*fp=fopen(path,“r”);int fd=fileno(fp);struct stat statbuf;fstat(fd,&statbuf);if(S_ISFIFO(statbuf.st_mode))//这是一个管道!