프로세스 간에는 커뮤니케이션을 할 수 있는 직접적인 방법은 없다.
프로세스 간 통신 기법 : 특별한 IPC(InterProcess Communication) 기법을 사용하여 진행.
프로세스들이 서로의 공간을 쉽게 접근할 수 있다면?
성능을 높이기 위해 여러 프로세스를 만들어서 동시 실행할 때
대부분의 IPC기법은 결국 커널공간을 활용하는 것임 : 커널공간은 공유하기 때문.
2번부터는 모두 커널 공간을 사용하는 것임 : 저장매체보다는 액세스하는 시간이 짧고 프로세스간 공유가 쉬움.
시그널과 소켓은 IPC기법으로 나온 것은 아니지만 기능을 이용하여 IPC로 사용가능하다.
코드 예제
shmid = shmget((key_t)1234, SIZE, IPC_CREAT|0666))
shmaddr = shmat(shmid, (void *)0, 0)
strcpy((char *)shmaddr, "Linux Programming")
printf("%s", (char *)shmaddr)
// 파이프 코드 예제
char* msg = "Hello Child Process!";
int main(){
char buf[255];
int fd[2], pid, nbytes;
if(pipe(fd) < 0){ // pipe(fd)로 파이프 생성
exit(1);
}
pid = fork(); // 이 함수 실행 다음 코드부터 부모/자식 프로세스로 나뉘어짐
if(pid > 0){ // 부모 프로세스는 pid에 실제 프로세스 ID가 들어감
write(fd[1], msg, MSGSIZE); // fd[1]에 씀
exit(0);
} else { // 자식 프로세스는 pidrk 0이 들어감
nbytes = read(fd[0], buf, MSGSIZE); // fd[0]으로 읽음
printf("%d %s\n", nbytes, buf);
exit(0);
}
return 0;
}
// 부모프로세스에서 write한 것을 자식프로세스에서 read할 수 있다는 것이 핵심. 즉 통신한다는 것.
// write(fd[1]) -> read(fd[0])
위 그림을 보면 부모프로세스에서 read는 할 수 없고, 자식프로세스에서 write를 할 수 없기 때문에 단방향통신이라고 불리는 것이다.
kill -l
이라고 치면 나온다.세마포어는 프로세스 사이의 동기를 맞추는 기능을 제공한다. 프로세스간에 공유 영역에 대한 접근 순서를 정해주어 공유 메모리가 손상되는 현상을 막아준다.