[운영체제]signal & pipe

정태규·2023년 4월 13일
0

운영체제

목록 보기
4/20
post-thumbnail

Signal

  • process의 특정한 event를 알리기 위한 IPC(inter-process-communication) 매커니즘이다.

  • synchronous(e.g., illegal memory access) 혹은 asynchronous(e.g., killed) 모두 될 수 있다.

  • software interrupt 로 생각 할 수 있다.

    • signal은 특정한 event들에 의해 생성된다.
    • OS는 signal을 process에게 전달한다.
    • signal handler는 signal을 처리한다.
      모든 signal은 해당하는 기본 signal이 있다.
      user는 몇몇 handler들을 재정의 할 수 있다.

pipes

  • 파이프는 두개의 process를 서로 통신하여 데이터를 주고 받을 수 있도록 해주는 통로이다.
  • 최초 UNIX 시스템의 첫번째 IPC 매커니즘중 하나이다.
  • ordinary pipe vs named pipes
  • Issues
    • 통신이 단반향인지 양방향인지
    • 양방향 통신에 경우 half-duplex인지 full-duplex인지??
    • 통신하는 process사이에 parent-child 같은 관계가 있어야만 하나??
    • 네트워크를 통해 사용할 수 있나?

Ordinary pipes

  • e.g cat data | sort | uniq -c; git diff | grep -e "^+" | wc -l
  • 표준의 제공자-수요자 형태의 통신을 한다.
  • producer는 pipe의 write-end에 write 한다.
  • consumer는 다른쪽 끝(read-end)에서 read 한다.
  • 단방향이다.
  • parent-child 관계가 확립되어야 한다.

file descriptor

  • file이나 I/O resource를 처리하기 위해 사용하는 abstract indicator이다.

Linux에서 ordinary pipe 사용

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
	int pipefd[2] // pipefd[0] for read, pipefd[1] for write
    pid_t cpid;
    char buf;
    
    if(pipe(pipefd) == -1){ // create pipe
    	perror("pipe");
        exit(EXIT_FAILURE);
    }
    cpid = fork();
    if(cpid == 0){
    	// child
        close(pipefd[1]); // child에서는 read만 하기 때문에 사용하지 않는 pipe의 write end를 닫는다.
        while(read(pipefd[0]. &buf,1)>0) //파이프 read 에서  1글자씩 읽어서 buf에 저장하고
        	write(STDOUT_FILENO, &buf,1); // buf에 저장된 값을 stdout에 write한다.
       
		write(STDOUT_FILENO, "\n",1);
        close(pipfd[0]); // pipe의 read end를 닫는다.
        exit(EXIT_SUCCESS);     
    }else{
    	//parent
    	close(pipefd[0]); //사용하지않는 pipe의 read end를 닫는다.
        write(pipefd[1],argv[1],strlen(argv[1])); // pipe의 write end에 argv[1]을 쓴다.
        close(pipefd[1]); //pipe의 write end를 닫는다.
        wait(NULL); //자식 프로세스 끝날때 까지 기다렸다가 종료시킨다.
    	exit(EXIT_SUCCESS);
        
        exit(EXIT_SUCCESS);
    }
    return 0;
}

Named Pipes

  • ordinary pipe보다 더 강력하다.

    • 양방향성이다.
    • parent-child 관계가 필요하지 않다.
    • 몇몇 process들은 통신을 위해 named pipe 사용한다.
    • named pipe는 프로세스가 종료되고 나서도 활성 상태를 유지한다.
  • UNIX와 window에서 제공된다.

0개의 댓글