프로세스들이 서로의 공간을 쉽게 접근할 수 있다면? -- 프로세스 데이터/코드가 바뀔 수 있으니 얼마나 위험할까?
출처: http://www.drdobbs.com/security/anatomy-of-a-stack-smashing-attack-and-h/240001832
프로세스간에 커뮤니케이션을 해야한다면 어떻게 해야할까?
OS.xlsx -> IPC
CPU가 한 개일때만 생각하지만, 최근에는 CPU 안에 코어가 8개 되는 경우도 많고, 각 프로세스를 각 코어에 동시 실행 가능(병렬 처리)
여러 프로세스 동시 실행하기 예
1 ~ 10000까지 더하기
단, 이 때 각 프로세스가 더한 값을 수집해야 하므로, 프로세스간 통신 필요
CPU 병렬 처리가 가능하다면, 더 빠른 대응이 가능
단, 이 때 각 프로세스 제어 및 상태 정보 교환을 위해 프로세스간 통신 필요
프로세스간에 커뮤니케이션을 해야한다면 어떻게 해야할까?
간단히 다른 프로세스에 전달할 내용을 파일에 쓰고, 다른 프로세스가 해당 파일을 읽으면 됨
OS.xlsx -> IPC - file
그래서 보다 다양한 IPC 기법이 있음
사용자 모드에서는 커널 공간 접근 불가
보다 구체적인 내용은 가상 메모리에서 다룸
2번부터는 모두 커널 공간을 사용하는 것임 - 이것이 핵심
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가 0이 들어감
write(fd[1], msg, MSGSIZE); //fd[1]에 씁니다.
exit(0);
}
else { // 자식 프로세스에는 pid가 실제 프로세스 ID가 들어감
nbytes = read(fd[0], buf, MSGSIZE); // fd[0]으로 읽음
printf("%d %s\n", nbytes, buf);
exit(0);
}
return 0;
}
A 프로세스
msqid = msgget(key, msgflg) // key는 1234, msgflg는 옵션
msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT)
B 프로세스
msqid = msgget(key, msgflg) // key는 동일하게 1234로 해야 해당 큐의 msgid를 얻을 수 있음
msgrcv(msqid, &rbuf, MSGSZ, 1, 0)
pipe, message queue 는 모두 kernel 공간의 메모리를 사용합니다.
메모리 공간도 kernel/user 로 구분됩니다. 이 부분은 가상 메모리와 함께 다음에 이해해보겠습니다.
shmid = shmget((key_t)1234, SIZE, IPC_CREAT|0666))
shmaddr = shmat(shmid, (void *)0, 0)
strcpy((char *)shmaddr, "Linux Programming")
printf("%s\n", (char *)shmaddr)
이상은 기본적인 IPC
각각은 알면 알 수록, 깊은 내용 간단하게만 짚고 넘어가기
Ctrl+C 를 눌러서 프로세스 종료시키기 (시그널 사용 예)
시그널 종류와 각 시그널에 따른 기본 동작이 미리 정해져 있음
시그널 종류: kill -l
exit (EXIT_SUCCESS);
}int main (void) { if (signal (SIGINT, signal_handler) == SIG_ERR) { printf("Can't catch SIGINT!\n"); exit (EXIT_FAILURE); }
for (;;)
pause();
return 0;
}
---
## 시그널 관련 코드 예제
* 시그널 핸들러 무시
```c
int main (void) {
if (signal (SIGINT, SIG_IGN) == SIG_ERR) {
printf("Can't catch SIGINT!\n");
exit (EXIT_FAILURE);
}
for (;;)
pause();
return 0;
}
소켓을 하나의 컴퓨터 안에서, 두 개의 프로세스간에 통신 기법으로 사용 가능
리눅스 커널 내부 네트워크 스택 예
실제 관련 코드에 대해서는 시스템 프로그래밍을 통해 실습 과정을 함께 진행해보겠습니다.