유닉스

유닉스

시그널 처리

프로세스 종료 전, 처리할 작업이 남았거나 특정 시그널에 대해 종료하고 싶지 않으면 시그널 수행할 함수 지정하면 됨 시그널 붙잡기 : 시그널 확인해 처리하는 일 시그널 핸들러 함수 시그널 핸들러 : 시그널 받았을 때 이를 처리하기 위해 지정된 함수 signal #include void (*signal(int sig, void (*disp)(int)))(int); void handler(int signo){ printf("signal handler signal number : %d\n",signo); } int main(){ void (*hand)(int); //시그널 함수 리턴값인 함수 포인터 저장할 변수 선언 hand = signal(SIGINT, handler); printf("wait 1st ctr..

유닉스

시그널 보내기

프로그램에서 시그널 보내려면 kill, raise, abort 함수 사용하면 됨 $kill -9 3255 PID가 3255인 프로세스를 강제로 종료하는 명령 인자로 지정한 프로세스에 시그널 보내는 명령 kill #include #incldue int kill(pid_t pid, int sig); int main(){ kill(getppid(), SIGCONT); //부모에게 ISGCONT, SIGCONT : 무시, 특별한 처리 x kill(getpid(), SIGQUIT); //코어 덤프 발생시키며 종료, 자신에게 SIGQUIT //이 뒤에거는 실행이 안됨 } pid : 시그널 받을 프로세스의 ID 0보다 큰 수 : pid로 지정한 프로세스에 시그널 보냄 0 : 특별한 프로세스(스케쥴러)를 제외 [PGI..

유닉스

시그널

시그널 소프트웨어 인터럽트 프로세스에 뭔가 발생했음을 알리는 간단한 메시지를 비동기적으로 보내는 것 유닉스 운영체제거 프로세스에 전달함 발생하는 경우 0으로 나누기와 같이 프로그램에서 예외적인 상황이 일어난 경우 프로세스가 시그널을 보낼 수 있는 함수 사용해 다른 프로세스에 시그널 보내는 경우 (kill) 사용자가 ctrl+c 같은 인터럽트 키 입력한 경우 처리 방법 받은 시그널에 따라 기본 동작 수행함 (대부분 종료) 시그널 무시 - 시그널 무시하기로 지정하면 유닉스는 프로세스에 시그널 전달 안함 시그널 처리 함수를 지정해놓고 시그널 받으면 해당 함수를 호출해 처리 (시그널 핸들러) 시그널 발생하지 않도록 블록 처리 (큐에 쌓여 있다가 시그널 블록이 해제되면 전달됨) 시그널 종류 파일에 정의되어 있음 ..

유닉스

프로세스 동기화

불안정 상태의 프로세스(좀비 프로세스 등) 발생을 방지하기 위해서 부모와 자식 프로세스를 동기화 해야함 좀비 프로세스 실행 종료 후 자원 반납한 자식 프로세스의 종료 상태 정보를 부모 프로세스가 얻어가지 않는 경우에 발생함 정상적인 프로세스 종료 과정 자식 프로세스가 종료를 위해 부모 프로세스에 종료 상태 정보를 보냄 부모 프로세스는 이 정보를 받으면 프로세스 테이블에서 자식 프로세스 삭제 제거 방법 부모 프로세스가 wait 관련 함수를 호출해야 사라짐 (일반적인 방법으로는 제거 불가능) 고아 프로세스 자식보다 부모가 먼저 종료하면 자식은 고아 프로세스가 됨 init(PID 1) 프로세스의 자식 프로세스로 등록됨 프로세스 동기화 부모 프로세스는 자식 프로세스가 종료될 때까지 기다려야 함 wait 자식 p..

유닉스

Compiler directive

실행 시간 측정하기 #ifdef TIMES start = dclock(); #endif //시간 측정 부분 #ifdef TIMES end = dclock() - start(); printf(end); #endif $gcc -DTIMES -o t1 t1.c -D compiler directive 명령어 TIMES 임의로 이름 설정 가능함 #include #include #include #include main() { int status; pid_t pid; #ifdef TIMES struct timeval stime,etime; int time_result; #endif pid = fork(); #ifdef TIMES gettimeofday(&stime, NULL); #endif if (pid == 0) ..

유닉스

exec 함수군

path나 file에 지정한 명령이나 실행 파일을 실행함 arg, envp로 시작하는 인자를 parh 나 file에 지정한 파일의 main 함수에 전달함 exec 함수 실행되면 프로세스의 메모리 이미지는 실행파일로 바뀜 #include int execl(const char *path, const char *arg(), ... , const char *argn, (char *)0); int execv(const char *path, char *const argv[]); int execle(const char *path, const char *arg0, ... , const char *argn, (char *)0, char *const envp[]); int execve(const char *path, ch..

유닉스

프로세스 생성

프로그램 실행 - system 명령 실행하기 위해 쉘까지 동작시켜서 비효율적임 #include int system(const char *string); int main(){ int a; a = system("ps -ef | grep han > han.txt"); //system 안의 명령어 실행하고 0 반환 //모든 실행중인 process 중 han grep해서 나열한걸 han.txt에 저장 printf("Return Value : %d\n",a); } 프로세스 생성 - fork 일반적으로 exec와 같이 사용 parent는 다 한 후에 반드시 wait 해야함 새로운 프로세스 생성함 - 자식 프로세스 fork 함수 호출한 프로세스는 부모 프로세스가 됨 자식 프로세스는 부모 프로세스의 메모리 복사함 RUI..

유닉스

프로세스 정보

프로세스 목록 보기 ps : 현재 실행중인 프로세스 목록 보기 (로그인한 id 상태에서 돌고 있는 프로세스) -ef 옵션 : 서버에서 사용중인 전체 프로세스 보기 ps -ef | more ps -ef | grep 학번 -> 내 프로세스만 보고 싶을 때 top : CPU, swap, ... 확인 가능 zombit : 자식 process의 부모 process가 존재하지 않을 때 프로세스 식별 - getpid, getppid #include pid_t getpid(void); //함수 호출한 프로세스의 PID 리턴 pid_t getppid(void); //부모 프로세스의 PID 리턴, 바뀌지 않음 프로세스 그룹 관련 있는 프로세스 묶은 것으로 PGID(프로세스 그룹 ID)가 부여됨 프로세스 그룹 리더 그룹 구..

hahihi
'유닉스' 카테고리의 글 목록 (2 Page)