Computer Science/시스템프로그래밍2 (19) 썸네일형 리스트형 시그널과 프로세스 커널모드에서 사용자 모드로 전환시 Process PCB에 있는 시그널 관련 자료구조를 통해 시그널 정보를 확인하여 해당 정보 처리. 시그널 관련 자료구조들 pending : 수신시그널의 순서를 자료구조에서 가지고 있다. blocked : 64bit 1로 바뀌면 시그널이 블록되어있다. sigpending : 블록된 시그널이 무엇인지 관리하는 자료구조 sig : 각각의 받은 시그널에 대해서 어떤 동작을 취해야하는지 관리하는 자료구조 (default인지, 재정의한건지) 프로세스 안에 시그널이 들어오면 시그널관련 자료구조에서 해당 시그널을 넣어 둠. 하나의 프로세스는 시스템 콜을 처리하거나 인터럽트를 받거나 시스템 자원 처리, 스케쥴링 시그널(signal) -시그널 : 유닉스에서 30년 이상 사용된 전통적인 기법 : 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법 ex) CTRL+C : 눌러서 프로세스 종료시키기, CTRL+Z : 눌러서 해당 프로세스가 백그라운 프로세스로 바꾸기 -> 미리 정의 되어있는 시그널이 운영체제에서 프로세스에 전달이 되는 것 ,그래서 프로세스에서 해당 시그널에 알맞은 디폴트 처리되어 있는 것으로 동작한다. 시그널 종류 (시그널 번호가 매핑) - SIGKILL : 프로세스 죽이기 (슈퍼관리자가 사용하는 시그널) - SIGALARM : 알람 발생 - SIGSTP : 프로세스 멈추기 (ctrl + z) - SIGCONT : 멈춰진 프로세스 실행하기 - SIGINT : 프로세스에 인터럽트를 보내서 프로세.. IPC 기법 실습3 -공유메모리(Shared Memory) : kernel space에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식 (커널에 있는 공간을 변수로 맵핑 시켜서 해당 데이터를 참조하는 방식) : 공유메모리 key를 가지고, 여러 프로세스 접근 가능 1. 공유 메모리 생성 int shmget(key_t key, size_t size, int shmflg); key : 임의 숫자 또는 ftok 함수로 생성한 키값 size : 공유 메모리 크기 shmflg : 공유 메모리 속성 리턴값 : 공유 메모리 식별자 리턴 shmid=shmget((key_t)1234,SIZE,IPC_CREAT|0666)) 2. 공유 메모리 연결 void *shmat(int shmid, const void *shmaddr, int shmflg); shmid : shmget.. msgctl(): 메세지 큐를 컨트롤 한다 커널영역에 메세지 큐, 공유 메모리, Semaphore 가 생성이 되면, 이 메모리를 명시적으로 삭제하는 방법 msgctl(msgid, IPC_RMID,0); ipcs 명령어 msgctl()명령어를 이용하여 메세지 큐를 제거 해 줄 수 있다. shmctl()명령어를 이용하여 공유 메모리를 제거 해 줄 수 있다. ipcs 명령어를 이용하면 현재 커널영역에 Message Queues, 공유메모리, Semaphore(운영체제)를 표시해줌 Message Queues Shared Memory Segements Semaphore Arrays 참고 ftok() 키생성을 위한 함수 ftok() : path 경로명의 inode 값과 숫자값(id)를 기반으로 키 생성 : 경로 삭제 후 재생성시 inode 값이 달라지므로, 이전과는 다른 키값이 리턴 #include key_t ftok(const char *path, int id); key=ftok("keyfile",1); - 해당 파일(디렉토리) 값과 변수명의 조합으로 unique한 키 값을 생성할 수 있다. id=msgget(key,IPC_CREAT|0644); IPC 기법 실습2 -Message queue 메세지 큐(Message queue) : FIFO(First in First out) 정책으로 데이터 전송 : 양방향 통신이 가능하다 (key값으로 메세지를 전송하고 받을 수 있다) msqid=msgget(key,msgflg) : 메세지큐를 하나 생성 msgget() 시스템콜 이용 key:1234(다른메세지큐와 구분된 정수값으로 설정), msgflg는 옵션 (IPC_CREAT|접근권한 : 새로운 키면 식별자로 새로 생성) msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) : 메세지 큐를 보낼 때 사용하는 msgsnd() 시스템콜 이용 msgflg 설정 : 블록모드(0):상대방이 읽을 때까지 코드가 멈춰있다, 비블록모드(IPC_NOWAIT):상대방이 읽지 않아도 다음코드를 실.. IPC 기법 실습1 -pipe Pipe : 단방향 통신 (부모->자식) 프로세스를 fork()하여 자식프로세스를 만들어 부모에서 자식으로만 보낼 수 있다 1. 부모프로세스에서 fd[1]에 입력할 메세지를 write() 시스템콜을 사용해서 입력 2. 자식프로세스에서는 fd[0], 공란 buf에 read() 시스템콜을 이용하여 읽어서 메세지를 받음 #include #include #include #define MSGSIZE 255 char* msg="Hello Child Process!"; int main(){ char buf[255]; int fd[2], pid, nbytes; if (pipe(fd)0){ printf("parent PID:%d, child PID:%d\n",getpid(), pid); write(fd[1], msg, .. 이전 1 2 3 다음