본문 바로가기

유닉스

(14)
[통신프로그래밍] IPC(메시지큐, 공유 메모리, 세마포어) 유닉스는 처음 개발된 이래 다양한 형태로 발전했는데, 크게 BSD 계열과 시스템 V 계열로 구분할 수 있습니다. 이중 시스템 V 계열 유닉스에서 개발해 제공하는 프로세스 간 통신 방법이 메시지 큐, 공유 메모리, 세마포어입니다. 흔히 이 세가지를 묶어서 시스템 V IPC라고 합니다. 시스템 V IPC는 SVR2에서 처음 개발되었고, SVR4에서도 제공하고 있으며 현재는 대부분의 유닉스 시스템에서 제공하고 있습니다. 시스템 V IPC를 사용하려면 IPC의 객체를 생성해야 합니다. 이를 위해 공통적으로 사용하는 기본 요소가 키와 식별자입니다. 또한 현재 사용 중인 각 IPC의 상태를 확인하고, 사용을 마친 객체는 삭제할 수 있도록 관리 명령을 제공합니다. 키의 생성 및 IPC 관리 명ㄹ영르 아래에 요약해 두..
[통신프로그래밍] 파이프 파이프는 두 프로세스 사이에서 한 방향으로 통신할 수 있도록 지원합니다. 쉘에서 | 기호는 파이프를 의미합니다. 쉘에서 파이프 기능은 한 명령의 표준 출력을 다음 명령에서 표준 입력을 받아 수행하는 것을 의미합니다. 예를 들어보겠습니다. # grep pipe test.c | more 앞에 있는 명령인 grep pipe test.c의 표준 출력을 다음 명령인 more의 표준 입력으로 사용합니다. 위 예를 실행하면 test.c에서 "pipe"라는 문자열이 위치한 행을 찾아 화면 단위로 출력(more)합니다. 파이프는 이름없는 파이프(익명 파이프:anonymouse pipe)와 (이름 있는 파이프:named pipe)로 구분됩니다. 이름 없는 파이프 : pipe 특별한 수식어 없이 그냥 파이프라고 하면 일반적..
[통신프로그래밍] 메모리 매핑 앞서 시스템프로그래밍 섹션에서 다루었던 프로그램은 대부분 단일 파일로 구성된 매우 간단한 것이었습니다. 하지만 업무 처리나 게임 등 실제 사용하는 응용 프로그램은 이렇게 간단하지 않습니다. 보통 하나 이상의 실행 파일이 생성되고, 이를 실행한 프로세스 사이에서 시그널이나 데이터를 주고받으며 작업을 처리합니다. 이렇게 프로세스 사이에서 데이터를 주고받으려면 통신 프로그래밍이 필요합니다. 통신 프로그래밍을 하면 유닉스 시스템에서 제공하는 다양한 통신 기능을 이용하는 응용 프로그램을 만들 수 있습니다. 유닉스 시스템이 제공하는 통신 기능은 크게 두가지로 구분할 수 있습니다. 하나는 동일한 시스템 안에 있는 프로세스 사이에서 통신을 수행하는 것이고, 두번째는 서로 다른 시스템에서 수행하고 있는 프로세스 사이에서..
[시스템프로그래밍] 시그널 시그널은 소프트웨어 인터럽트(software interrupt)로, 프로세스에 뭔가 발생했음을 알리는 간단한 메시지를 비동기적으로 보내는 것입니다. 시그널은 0으로 나누기처럼 프로그램에서 예외적인 상황이 일어나는 경우나, 프로세스가 시그널을 보낼 수 있는 함수를 사용해 다른 프로세스에 시그널을 보내는 경우에 발생합니다. 보통 시그널로 전달되는 메시지는 무엇이 발생했는지를 표시하는 미리 정의된 상수를 사용합니다. 시그널을 받은 프로세스는 시그널에 따른 기본 동작을 수행하거나, 시그널을 무시하거나, 시그널 처리를 위해 특별히 지정된 함수를 수행하도록 할 수 있습니다. 프로그램에서 시그널을 보내려면 아래 함수들을 사용하며, 이중 kill 함수를 가장 많이 사용합니다. 기능 함수원형 시그널 보내기 int kil..
[시스템프로그래밍] 프로세스 생성과 실행 유닉스에서 프로세스는 사용자가 명령행에서 직접 프로그램을 실행해 생성하는 경우도 있지만, 프로그램 안에서 다른 프로그램을 실행해 생성하는 경우도 있습니다. 이렇게 프로그램에서 다른 프로그램을 실행해 새로운 프로세스를 생성할 때는 system, fork, vfork 함수를 사용합니다. 기능 함수원형 프로그램 실행 int system(const char *string); 프로세스 생성 pid_t fork(void); pid_t vfork(void); 유닉스 프로세스가 종료되면 해당 프로세스가 어떻게 종료되었는지를 나타내는 종료 상태를 저장합니다. 자식 프로세스는 부모 프로세스에 자신이 어떻게 종료되었는지를 알리는 종료 상태값을 리턴할 수 있습니다. 일반적으로 종료 상태값이 0이면 정상적으로 종료했음을 의미합..