본문 바로가기

반응형

개발👩‍💻/시스템프로그래밍

(9)
프로세스 다루기 1(11-1) uid 라는 것이 real uid, effective uid 로 나뉘어진다. real uid는 로그인할 때 정해진다. 사용자가 로그인해 프로세스를 생성하면 프로세스 real uid는 그 사용자가 된다. 그리고 이 사용자는 super user일 경우에만 변경이 가능하다. root 일 경우를 제외한 다른 유저일 경우 프로세스의 real uid를 변경 할 수 없다. effective uid는 파일의 접근 권한 따질때 사용한다. 접근 권한을 그냥 주는 것이 아니라 3개의 그룹으로 나눠 준다. 파일의 onwer, group, other 각각의 사용자 그룹이다. 파일의 onwer가 있다면, 그 사용자에게 접근권한이 주어진다. 프로세스의 real uid, effective uid 두개 유저 id 가 있는데, ㄱeal..
프로세스 다루기 1(10-4) fork와 exec를 함께 사용하기 일반적으로 exec이 홀로 쓰이는 경우는 매우 드물다. 보통 fork와 함께 쓰인다. 프로세스가 있는데 그 프로세스가 포크를 불러서 자식프로세스를 만든다 자식 프로세스는 부모 프로세스와 똑같은 프로세스 생성, exec 불러서 다른 프로그램으로 바뀐다. 이런식으로 부모, 자식 프로세스가 전혀 다른 프로그램을 실행하도록 하는 유닉스 내의 방법 int main() { pid_t pid; printf("hello!\n"); if ((pid = fork()) > 0) { /* parent process */ printf("parent\n"); sleep(1); } else if (pid == 0) { /* child process */ printf("child\n"); exec..
프로세스 다루기 1(10-3) int execl(cont char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execv(cont char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); exec 계열의 시스템 콜에 대해 알아보자 사용 목적은 현재 프로세스의 코드부분을 다른 실행파일로 교체하기위함이다. 각각의 시스템콜들의 대한 사용방법을 설명하기 전에 exec이 무엇인지 보자 하드디스크에 있는 프로그램이 메인메모리에 적재되어 실행되고 있다. 프로세스에 관련된 속성 정보들이 프로세스 테이블에 기록되어 있다. 회색프로그램을 연두색 프로그램으..
프로세스 다루기 1(10-2-2) int main() { int fd, n; char line[512]; fd = open("data.txt", O_RDONLY); n = read(fd, line, 17); line[n] = '\0'; fprintf(stderr, "before fork: %s", line); if (fork() > 0) { /* parent process */ sleep(3); n = read(fd, line, 17); line[n] = '\0'; fprintf(stderr, "parent process: %s", line); } else { /* child process */ n = read(fd, line, 17); line[n] = '\0'; fprintf(stderr, "child process: %s", lin..
프로세스 다루기 1(10-2-1) 프로세스와 관련된 여러가지 시스템 콜들에 대해서 설명한다. fork: 이 fork 시스템 콜을 호출한 프로세스와 동일한 자식 프로세스를 생성한다. exec: 6가지 종류가 있고, 프로세스 코드 부분을 다른 프로그램을 교체할 때 사용된다. exit, _exit: exit은 프로세스를 종료하고 종료 상태를 부모 프로세스에게 전달하는 목적, _exit은 exit과 거의 같지만, atexit함수를 통해서 등록된 함수들을 호출하지 않고 그냥 프로세스를 종료한다는 차이점이 있다. atexit: exit에의해 종료될 때 호출될 함수를 등록할 때 fork 인자없이 fork()만 호출하면 된다. 함수로부터 리턴하는 것은 한번이 아닌 두번이다. 어떤 프로세스가 있는데 이 fork를 부르면 자신과 똑같은 자식프로세스를 만든..
리눅스 프로세스 관리(10-1) 프로세스라고 하는 것은 실행중 상태에 있는 프로그램을 말한다. c로 프로그램을 짰다고 하면 컴파일 해서 기계어로 된 실행 파일을 만들었다. 파일 형태로 디스트에 저장된다. 그 프로그램을 실행시켜 실행중인 상태에 있는 것을 프로세스라고 한다. 하나의 프로그램을 동시에 여러번 실행히킬 수 있는데, 두개의 프로세스로써 따로따로 실행될 수 있다. 이런 프로세슬르 실행하는 방법이 있다. 유닉스에서 명령을 내려서 실행시키면, 로그인을 했을 때 쉘프로세스가 실행이된다. 쉘프로세스가 프롬프트를찍어서 명령어를 입력하게 하고 입력하면 명령어를 실행시키기 위해 새로운 프로세스, 자식 프로세를 하나 만든다. 그래서 자식 프로세스에게 프로그램을 실행하게 만든다. 프로그램이 실행되는 동안에는 프롬프트가 생기지 않는다. 실행을 마..
예제 프로그래밍: myrmdir, myls(9-2) myrmdir 해당 디렉토리 포함해서 모든 디렉토리와 파일을 삭제하는 프로그래밍 + 파일이 주어지면 디렉토리가 아니기 때문에 아무것도 삭제하지 않는다. 주어진 인자가 디렉토리인지 파일인지 확인한다 stat()을 호출하여 S_ISDIR() 메르토 사용하여 해당 인자가 디렉토리인지 확인한다 디렉토리인 경우 removeDir()을 호출한다. removeDir opendir(), readdir(), closedir()을 호출한다. readdir을 호출하여 해당 디렉토리에 있는 파일 및 디렉토리들을 확인한다. 그리고 읽어들인 엔트리가 디렉토리인 경우 다시 removeDir을 호출하여 삭제한다. 읽어들인 엔트리가 파일인 경우 unlink를 사용해서 해당 파일을 삭제한다. 디렉토리 내에 모든 파일/디렉토리가 삭제되면..
디렉토리 다루기(9-1) mkdir,rmdir opendir,closedir readdir rewinddir chdir getcwd mkdir, rmdir * 삭제는 빈 디렉토리만 가능함 int mkdir(const char *pathname, mode_t mode) int rmdir(const char* pathname) 성공하면 0, 실패하면 -1 을 반환한다. 디렉토리를 생성하고 그냥 ls를 했을 때는 아무것도 안나오지만, ls -a 로 히든파일까지 모두 보면 . 과 .. 이 나온다. 이는 현재디랙토리와 부모디렉토리를 가리키는데, 이들의 생성/수정시간을 보면 해당 디렉토리가 생성된 시간으로 나와있다. * 부모 디렉토리를 가리키는 .. 또한 현 디렉토리 생성 시간으로 시간이 설정되어 있다. 그리고 해당 디렉토리를 파일을 생성..