Tutorial :Distinguishing a pipe from a file in Unix



Question:

Given a FILE*, is it possible to determine the underlying type? That is, is there a function that will tell me if the FILE* is a pipe or a socket or a regular on-disk file?


Solution:1

There's a fstat(2) function.

NAME stat, fstat, lstat - get file status

SYNOPSIS

   #include <sys/types.h>     #include <sys/stat.h>     #include <unistd.h>       int fstat(int fd, struct stat *buf);  

You can get the fd by calling fileno(3).

Then you can call S_ISFIFO(buf) to figure it out.


Solution:2

Use the fstat() function. However, you'll need to use the fileno() macro to get the file descriptor from file 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);  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »