시스템 프로그래밍(5)

조권휘·2022년 8월 21일
0

시스템 프로그래밍

목록 보기
5/14

PID Functions

Process IDs

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getpgrp(void);
  • 호출한 process의 PID/GID를 return한다.
  • process GID : session leader의 PID = shell의 PID
  • 자신이 속한 group ID = 현재 생성된 process를 만든 group
  • session : process group의 모임
  • ex) shell이 실행되고 shell에서 process가 실행되면 shell 내부의 process들이 한 session이 된다.

Parent Process ID

#include <sys/types.h>
#include <unistd.h>
pid_t getppid(void);
pid_t getpgid(pid_t tpid);
  • 호출한 parent/group의 parent PID를 return한다.
  • tpid : 요청한 process의 ID

Process Group Leader

  • Session leader의 PID가 pgid이다. = group의 leader
  • child도 모두 이 group에 속하게 된다.
  • signal이 session leader에게 전달되면 group 모두 동일하게 적용한다.
  • 만일 session leader가 종료하면 "SIGHUP" signal이 전달되고, group내의 모든 process가 종료된다.
  • session이 종료되도 계속 진행하고 싶다면 background mode로 진행하면 된다. 단, std I/O가 아닌 file I/O를 사용해야한다. "nohup" command를 이용하면 된다.

Setting PGID

#include <sys/types.h>
#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);

  • pid : Process ID
  • pgid : Process group ID
  • return : 성공 시 0 / 실패 시 -1

Exit Handler

atexit()

#include <stdlib.h>
int atexit(void (*func)(void));
  • exit()이 호출되었을 때 func를 실행하는 함수
  • 여러번 호출하게 되면 stack처럼 진행한다. → LIFO 방식
  • ex) f1, f2가 순서대로 호출되었다면 실행 순서는 f2, f1이다.

System()

#include <stdlib.h>
int system(const char *string);
  • string으로 shell command를 실행하는 함수
  • string : shell command(ex. ls -al / ps / kill -9 ...)

Race Condition

  • process 사이에 data를 공유해서 각 process의 실행 순서에 따라 결과 값이 계속 달라지는 현상
  • ex) fork() 이후 parent가 먼저일지 child가 먼저일지 모른다.

sleep()

#include <unistd.h>
#include <time.h> // nanosleep 사용 시 include

int sleep(unsigned int seconds);
int usleep(useconds_t usec);
int nanosleep(const struct timespec *req, struct timespec *rem);
  • seconds만큼 대기(block)하는 함수
  • return : 정상 종료 시 0 / interrupt 시 lefttime
  • left time : signal에 의해 interrupt 되고 wake한 기분

Process time

#include <sys/times.h>

clock_t times(struct tms *buf);

Returns:
struct tms(
clock_t tms_utime; /* user cputime */
clock_t tms_stime; /* system cputime */
clock_t tms_cutime; /* child user cputime */
clock_t tms_cstime; /* child system cputime */
}
  • process의 수행시간을 clock_t 단위로 계산한다.
  • clock cycle time(주기/길이) * clock_t = time
  • wall clock time(경과 시간) : program이 실행한 뒤부터 종료할 때까지 모든 시간을 합친 것
profile
안녕하세요 :) Data/AI 공부 중인 한국외대 컴퓨터공학부 조권휘입니다.

0개의 댓글