프로그래밍 씨,씨,씨 - 함수, union

2023. 1. 11. 19:59프로그래밍

728x90

목차

1. <unistd.h> 디렉토리 조작 함수들​

2. <sys/types.h>,<sys/dir.h> 디렉토리 스캔 및 소팅 디렉토리

​​3. 파일 조작 루틴들: unistd.h, sys/types.h, sys/stat.h

​4. 파일 상태

5. 파일조작: stdio.h, unistd.h

​​6. 임시 파일 생성:<stdio.h>

  

유닉스는 디렉토리들과 파일들의 조작을 위해서 많은 유틸리티를 제공한다.

cd, ls, rm, cp, mkdir 등등 ...

이런 명령어를 어떻게 비슷하게 C 함수에서 만들수 있을까?

1. <unistd.h> 디렉토리 조작 함수들

디렉토리 계층을 순환하거나 디렉토리 내용에 대해서 질의 하면서 적당한 함수들을 호출할 수 있도록 해주는 헤더이다.

int chdir(char *path) -- 특정 경로 문자열로 디렉토리를 접근한다.

if (chdir(argv[1]) != 0)
{ printf("Error in chdir\n");
exit(1);
}
 

char *getwd(char *path) -- 현재 구동 디렉토리의 전체 경로 이름을 반환한다.

path가 반환되어 지는 경로의 포인터이다.

2. <sys/types.h>,<sys/dir.h> 디렉토리 스캔 및 소팅 디렉토리

(멀티 쓰레드 상이 아니라 BSD 플랫폼 상에서) 두개의 유용한 함수가 있다.

scandir(char *dirname, struct direct **namelist, int (*select)(), int (*compare)())

디렉토리 dirname을 읽고 디렉토리 엔트리들의 포인터의 배열을 빌드하거나 에러(-1)를 생성한다.

namelist는 구조체 포인터들의 배열이다

select는 디렉토리 엔트리의 포인터이다(<sys/types>에 정의)

마지막 아규먼트 compare는 qsort로 전달한다. NULL 이면 소팅하지 않는다.

예제:

alphasort(struct direct **d1, **d2) - 알파벳 순으로 소팅.

#include <sys/types.h>
#include <sys/dir.h>
#include <sys/param.h>
#include <stdio.h>


#define FALSE 0
#define TRUE !FALSE

extern int alphasort();
char pathname[MAXPATHLEN];

void main()
{
	int count,i; struct direct **files;
	int file_select();

	if (getwd(pathname) == NULL )
	{
		printf("Error getting path\n");
		exit(0);
	}

	printf("Current Working Directory = %s\n",pathname);
	count = scandir(pathname, &files, file_select, alphasort);

	/* 파일을 찾지 못하면, 선택없는 메뉴 아이템을 만든다. */
	if (count <= 0) {
		printf("No files in this directory\n");
		exit(0);
	}

	printf("Number of files = %d\n",count);

	for (i=1;i<count+1;++i)
		printf("%s ",files[i-1]->d_name);
	printf("\n"); /* flush buffer */
}

int file_select(struct direct *entry)
{
	if ((strcmp(entry->d_name, ".") == 0) ||
	(strcmp(entry->d_name, "..") == 0))
		return (FALSE);
	else return (TRUE);
}
 

scandir 함수는 현재 디렉토리(.)와 상위 디렉토리(..)의 모든 파일들을 리턴한다.

file_select 함수를 이렇게 .h .o .c 파일만 찾도록 만들 수 있다.

다음은 .h .o .c 파일만 찾도록 만든 file_select 함수이다

int file_select(struct direct *entry)
{
	char *ptr;
	char *rindex(char *s, char c);

	​
	if ((strcmp(entry->d_name, ".")== 0)
	||(strcmp(entry->d_name, "..") == 0))
		return (FALSE);

	​
	/* 파일 확장자를 체크한다. */
	ptr = rindex(entry->d_name, '.')
	
	if ((ptr != NULL) &&
	((strcmp(ptr, ".c") == 0) ||
	(strcmp(ptr, ".h") == 0) ||
	(strcmp(ptr, ".o") == 0) ))
		return (TRUE);
	else
		return(FALSE);
}
 

rindex 함수는 문자열 s내에 문자 c의 마지막 나타난 곳의 포인터를 리턴하거나, NULL을 리턴한다.

(r은 reverse를 나타내므로 마지막 나타난곳 반대는 index() 함수이다)

3. 파일 조작 루틴들: unistd.h, sys/types.h, sys/stat.h

파일 접근 함수

int access(char *path, int mode)


R_OK - 읽기 권한 테스트

W_OK - 쓰기 권한 테스트

X_OK - 실행이나 검색 권한 테스트

F_OK - 디렉토리들이 파일을 검색하거나 존재유무 테스트.


access() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다.

int chmod(char *path, int mode) : 파일의 접근 모드를 바꾼다.

chmod() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다.


4 (octal 100) = read only,

2 (010) = write,

6 (110) = read

그리고 write, 1 (001) = execute​


​4. 파일 상태

파일의 현재 상태를 질의하는 유용한 함수

int stat(char *path, struct stat *buf),

int fstat(int fd, struct stat *buf)

stat(), 와 fstat() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다..

에러는 다음 헤더에 있다. #include <sys/stat.h>

5. 파일조작: stdio.h, unistd.h

int remove(const char *path);

int rename(const char *old, const char *new);

int unlink(cons char *path) --- path 이름의 디렉토리 요소를 제거한다.

unlink() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다..

에러는 다음 헤더에 있다. #include <sys/stat.h>

link(const char *path1, const char *path2) ---

기존 디렉토리 요소 path1을 새로운 엔트리인 path2에 링크시킨다.

6. 임시 파일 생성:<stdio.h>

임시 파일의 조작은 운영체제에서 한다(파일 삭제 등등)

FILE *tmpfile(void) --- 임시파일을 생성하고 스트림을 연다. 파일레퍼런스가 닫히면 삭제된다.

char *tmpnam(char *s) 함수는 임시파일을 안전하게 사용할 수 있도록 해준다.

char *tmpnam_r(char *s)

char *tempnam(const char *dir, const char *pfx) 도 존재한다.

이상

 

728x90