728x90
📦 리눅스 소켓 파일이 뭔지 알려줌
소켓 파일이란, 리눅스에서 파일처럼 생겼지만 사실은 프로세스끼리 대화하려고 쓰는 통신 도구임. 보통은 유닉스 도메인 소켓이라고 부름. 생긴 건 그냥 /tmp/mysocket 이런 식으로 생겼고, 실제로 파일 시스템에 존재함.
$ ls -l /tmp/mysocket
srwxr-xr-x 1 user user 0 Apr 4 13:00 /tmp/mysocket
맨 앞에 s 보이면 "이건 소켓 파일이다!" 라는 뜻임.
🧠 언제 쓰냐면
- 같은 컴퓨터 안에 있는 프로세스끼리 대화할 때 씀.
- 성능 빠름. 네트워크 스택 안 타니까 부담 적음.
- 보통 DB들이 이렇게 통신함. 예를 들어 MySQL이 클라이언트랑 얘기할 때 /var/run/mysqld/mysqld.sock 이런 파일 쓰는 경우 많음.
🆚 TCP 소켓이랑 뭐가 다르냐면
항목유닉스 소켓TCP 소켓
| 위치 | 파일 시스템 경로 (/tmp/...) | IP + 포트 번호 |
| 통신 대상 | 같은 머신 | 다른 컴퓨터도 가능 |
| 속도 | 빠름 | 상대적으로 느림 |
| 보안 | 파일 권한으로 관리 | 방화벽, 인증 등 필요 |
🛠️ 써보는 예시 (파이썬임)
서버 쪽
import socket, os
path = "/tmp/mysocket"
if os.path.exists(path):
os.remove(path)
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(path)
server.listen(1)
conn, _ = server.accept()
print("받은거:", conn.recv(1024).decode())
conn.close()
server.close()
클라이언트 쪽
import socket
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect("/tmp/mysocket")
client.sendall(b"안녕 서버야")
client.close()
📡 유닉스 도메인 소켓에서 쓰는 프로토콜은?
리눅스에서 유닉스 도메인 소켓을 사용할 때는 네트워크처럼 TCP/IP나 UDP 같은 전통적인 프로토콜을 쓰지 않음.
대신 파일 시스템 기반의 자체적인 전송 방식을 씀.
✅ 좀 더 구체적으로 말하면
소켓 만들 때 이 코드 보이잖슴:
socket(AF_UNIX, SOCK_STREAM)
여기서 의미는:
- AF_UNIX → 유닉스 도메인 소켓을 쓰겠다 (주소 체계)
- SOCK_STREAM → 스트림 방식으로 데이터 주고받겠다 (연결 지향, TCP처럼 작동)
- 이건 프로토콜이라기보단 통신 방식임
즉, 프로토콜이 TCP/UDP 같은 IP 프로토콜이 아니라,
커널 내부에서 구현된 파일 기반 IPC 프로토콜을 씀.
📋 요약하자면
항목설명
| 주소 체계 (AF_UNIX) | 유닉스 도메인 주소를 씀 (파일 경로) |
| 소켓 타입 (SOCK_STREAM, SOCK_DGRAM) | 통신 방식 정함 (스트림, 데이터그램 등) |
| 실제 프로토콜 | 네트워크 프로토콜 아님. 커널 내부 전용 프로토콜 (비공개) |
참고로…
- SOCK_STREAM → TCP처럼 동작 (연결 필요, 순서 보장)
- SOCK_DGRAM → UDP처럼 동작 (비연결, 순서 보장 안 됨)
- 그래도 실제 TCP/UDP 프로토콜을 쓰는 건 아님!
→ 그냥 "비슷한 동작 방식"일 뿐임.
🔑 IPC에서 말하는 KEY는?
👉 System V IPC (shm, msg, sem)에서 사용하는
식별자 역할을 하는 키값임.
즉, 여러 프로세스가 같은 공유 자원에 접근하려면
같은 키값을 사용해야 서로 통신 가능함.
📦 System V IPC에서 사용하는 자원들
- shm → 공유 메모리 (Shared Memory)
- msg → 메시지 큐 (Message Queue)
- sem → 세마포어 (Semaphore)
이 자원들은 만들 때 key_t 라는 타입의 키값을 줘야 함.
key_t key = ftok("/tmp/somefile", 1234);
int shmid = shmget(key, size, IPC_CREAT | 0666);
🔨 ftok() 설명
ftok(pathname, project_id) 함수는:
- 파일 경로 + 정수 값을 기반으로 해서
- 시스템 전체에서 유일한 키값을 만들어줌
그래서 둘 이상의 프로세스가 ftok("/tmp/foo", 1) 같은 걸 같이 쓰면
같은 키값이 생기고, 서로 공유 자원을 사용할 수 있게 됨.
❗ 주의할 점
- 키값은 그냥 "약속된 ID" 정도라고 생각하면 됨.
- 키값이 같아도 자원이 실제로 없으면 shmget() 같은 함수는 새로 만듦.
- 키 충돌 위험은 있으나, 대부분 ftok() + 고유 파일 조합으로 회피 가능
✅ 요약하면
항목설명
| KEY란? | System V IPC 자원을 구분하기 위한 식별자 |
| 왜 쓰냐? | 여러 프로세스가 같은 공유자원에 접근하려고 |
| 어떻게 만드냐? | ftok(path, id) 써서 생성 |
| 어디에 쓰냐? | shmget, msgget, semget 등에 전달 |
728x90
반응형
'OS > Linux' 카테고리의 다른 글
| [AIX] HACMP 핵심 요약 (0) | 2025.09.02 |
|---|---|
| [Linux]커널 파라미터 및 사용자 리소스 (shell limit) 설정 (1) | 2023.03.23 |
| [Linux] top 명령어 (0) | 2023.01.19 |
| [Linux] kernal memory 영역 (0) | 2023.01.19 |
| [Linux] ssh 접속 지연 조치 방법 (0) | 2022.12.05 |