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들을 재정의 할 수 있다.
- 통신이 단반향인지 양방향인지
- 양방향 통신에 경우 half-duplex인지 full-duplex인지??
- 통신하는 process사이에 parent-child 같은 관계가 있어야만 하나??
- 네트워크를 통해 사용할 수 있나?
#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;
}
ordinary pipe보다 더 강력하다.
- 양방향성이다.
- parent-child 관계가 필요하지 않다.
- 몇몇 process들은 통신을 위해 named pipe 사용한다.
- named pipe는 프로세스가 종료되고 나서도 활성 상태를 유지한다.
UNIX와 window에서 제공된다.