낭만 프로그래머 미쉘린 블로그에 좋은 예제가 많네요. 이번 글은 인수로 받은 문자열에 대해 어떤 타입의 파일인지를 확인하는 것입니다. 때로 처리해야될 파일이 어떤 종류인지를 먼저 알아야되 경우가 있습니다. 이럴 때 매우 유용하리라 생각 됩니다.


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

int main(int argc, char* argv[])
{
	int i;
	struct stat buf;
	char *ptr;
	
	for( i=1; i<argc; i++ )
	{
		printf("%s: ", argv[i]);
		if( lstat(argv[i], &buf)<0 )
		{
			perror("lstat error");
			continue;
		}
		
		if( S_ISREG(buf.st_mode) )
			ptr = "regular";
		else if( S_ISDIR(buf.st_mode) )
			ptr = "directory";
		else if( S_ISCHR(buf.st_mode) )
			ptr = "character special";
		else if( S_ISBLK(buf.st_mode) )
			ptr = "block special";
		else if( S_ISFIFO(buf.st_mode) )
			ptr = "fifo";
		
#ifdef S_ISLNK
		else if( S_ISLNK(buf.st_mode) )
			ptr = "symbolic link";
#endif
#ifdef S_ISSOCK
		else if( S_ISSOCK(buf.st_mode) )
			ptr = "socket";
#endif
		else
			ptr = "** unknown mode **";
		
		printf("%s\n", ptr);
	}
	exit(0);
}

lstat 은 파일의 타입을 읽어오는 함수입니다.
stat 과 lstat 이 있는데...

lstat 은 심볼릭링크의 경우 심볼릭링크 자체의 파일타입을 읽어오고
stat 은 심볼릭링크의 경우 심볼릭링크 가리키는 대상의 파일타입을 읽어오는 차이가 있습니다.

l 붙은 함수는 다 이런 차이가...