본문 바로가기

OS/Linux

[Linux] 소켓 파일

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