ex1. mkdir() 함수를 사용해 디렉터리를 2개(dir1, dir2) 만들고, 이 중 dir1은 rmdir() 함수로 삭제하고 dir2는 rename() 함수를 사용해 testdir로 바꾸는 프로그램을 작성하시오. (mkdir->rmdir->rename)
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main() {
if (mkdir("dir1", 0755) == -1) {
perror("dir1");
exit(1);
}
if (mkdir("dir2", 0755) == -1) {
perror("dir2");
exit(1);
}
if (rmdir("dir1") == -1) {
perror("dir1");
exit(1);
}
if (rename("dir2", "testdir") == -1) {
perror("rename");
exit(1);
}
return 0;
}
ex2. 현재 디렉터리를 기억하고 있다가 다른 디렉터리로 이동해 작업한 후 원래 디렉터리로 돌아오도록 프로그램을 작성하시오. (getcwd이용)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
char* owd; // owd: original working directory
char* cwd; // cwd: current working directory
// 현재 디렉터리를 기억
owd = getcwd(NULL, BUFSIZ);
printf("1. dir=%s\n", owd);
// testdir 디렉터리로 이동
chdir("testdir");
cwd = getcwd(NULL, BUFSIZ);
printf("** in dir:%s\n", cwd);
// 다시 원래 디렉터리로 이동
chdir(owd);
cwd = getcwd(NULL, BUFSIZ);
printf("2. dir=%s\n", cwd);
free(owd);
free(cwd);
return 0;
}
ex3. 다음 코드에서 오류를 리턴할 때 처리하는 코드를 추가하시오.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // getcwd() 함수, chdir() 함수
int main() {
char* cwd; // 현재 작업 디렉터리(current working directory)
cwd = getcwd(NULL, BUFSIZ);
printf("1.Current Directory: %s\n", cwd);
chdir("dong"); // "dong" 디렉터리로 이동
cwd = getcwd(NULL, BUFSIZ);
printf("2.Current Directory: %s\n", cwd);
free(cwd);
return 0;
}
// 실행 결과: 디렉터리가 이동, 하지만 디렉터리 이동은 프로그램 내부에서만 진행된다
// 따라서 프로그램 종료 후, pwd 명령으로 보면 현재 디렉터리가 바뀐 것은 아님을 알 수 있음
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
char* cwd;
cwd = getcwd(NULL, BUFSIZ);
if (cwd == NULL) {
perror("getcwd");
exit(1);
}
printf("1. Current Directory:%s\n", cwd);
int returnVal = chdir("dong");
if (returnVal == -1) {
perror("chdir");
exit(1);
}
cwd = getcwd(NULL, BUFSIZ);
if (cwd == NULL) {
perror("getcwd");
exit(1);
}
printf("2. Current Directory:%s\n", cwd);
free(cwd);
return 0;
}
ex4. 디렉터리가 비어 있는지 확인한 후 디렉터리가 비어 있다는 메시지를 출력하고, 해당 디렉토리를 삭제하는 프로그램을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
int main() {
DIR* dp; // dp: directory pointer
struct dirent* dent; // dent: directory entry
dp = opendir("testdir");
if (dp == NULL) {
printf("testdir 디렉터리가 없음\n");
exit(1);
}
int count = 0;
while ((dent = readdir(dp))) {
printf("name: %s / ", dent->d_name);
printf("inode: %d\n", (int)dent->d_ino);
count++;
}
closedir(dp);
// '.', '..' 밖에 없으면 삭제
if (count == 2) {
rmdir("testdir");
}
return 0;
}
hw1. 디렉토리명을 명령행 인자로 입력받아 생성하고, 작업 디렉터리를 새로 생성한 디렉터리로 이동시키는 프로그램을 작성하시오.
* getcwd로 생성된 디렉터리로 이동했다는 것을 보여주어야 함
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: prog_name dirname\n");
exit(1);
}
mkdir(argv[1], 0755);
chdir(argv[1]);
char* cwd = getcwd(NULL, BUFSIZ);
printf("** dir=%s\n", cwd);
free(cwd);
return 0;
}
hw2. ‘.’과 ‘..’ 항목을 제외하고 디렉터리에 있는 파일이나 하위 디렉토리명을 출력하는 프로그램을 작성하시오.
* if (dent->d_name[0] != '.’) 이용
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: prog_name dirname\n");
exit(1);
}
DIR* dp = opendir(argv[1]);
if (dp == NULL) {
perror("opendir: ");
exit(1);
}
struct dirent* dent;
while(1) {
dent = readdir(dp);
if (dent == NULL) {
break;
}
if (dent->d_name[0] != '.') {
printf("name: %s\n", dent->d_name);
}
}
closedir(dp);
return 0;
}
hw3. 파일명을 명령행 인자로 입력받고 이 파일이 현재 디렉터리에 있는지 확인하는 프로그램을 작성하시오. (found !! / not found !!)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: prog_name filename\n");
exit(1);
}
DIR* dp = opendir("."); // . : 현재 디렉터리
struct dirent* dent;
int found = 0;
while (1) {
dent = readdir(dp);
if (dent == NULL) {
break;
}
if (strcmp(dent->d_name, argv[1]) == 0) {
found = 1;
break;
}
}
closedir(dp);
if (found) {
printf("%s found !!\n", argv[1]);
exit(0);
}
else {
printf("%s not found !!\n", argv[1]);
exit(1);
}
return 0;
}
참고 및 출처: 시스템 프로그래밍 리눅스&유닉스(이종원)
'Computer Science > UNIX & Linux' 카테고리의 다른 글
[UNIX/Linux] ep2+) 파일 함수 실습 (1) | 2024.09.26 |
---|---|
[UNIX/Linux] ep2) 파일 다루기 (0) | 2024.09.24 |
[UNIX/Linux] ep1) 디렉터리 다루기 (2) | 2024.09.11 |
오픈소스 터미널 에뮬레이터(PuTTY, Termius, MobaXterm) (3) | 2024.09.04 |
[UNIX/Linux] ep0) 시스템 프로그래밍의 이해 (2) | 2024.09.04 |