파이프나 소켓 등은 주로 데이터를 교환하기 위한 목적으로 사용한다. 그러나 시그널(signal)은 어떤 이벤트가 발생했음을 알려주기 위해 사용한다.
즉, 프로세스에게 특정 이벤트가 발생했음을 알리는 소프트웨어 인터럽트라고 할 수 있다.
다시 말하지만 시그널의 작동 방식은 실제 인터럽트와 매우 유사하다. 프로세스가 실행 중일 때 시그널이 도착하면, 운영체제는 해당 프로세스의 실행을 잠시 중단하고 시그널 처리기를 실행한다. 시그널 처리가 완료되면 프로세스는 원래 하던 작업을 계속한다.
파이프나 소켓처럼 구체적인 데이터를 전송할 수는 없고, 어떤 이벤트인지 나타내는 시그널 종류만 전달할 수 있다. 시그널은 방향성이 있어서 시그널을 보내는 쪽과 시그널을 받는 쪽이 있다. 시그널은 커널이나 프로세스가 보낼 수 있고, 받는 주체는 프로세스이다.
그래서 시그널을 보낼 때는 대상 프로세스를 지정한다. 시그널을 수신한 프로세스는 시그널이 어떤 종류인지는 알 수 있지만, 시그널을 누가/언제/어떤 목적으로 보낸 것인지는 알 수 없다. 단지 시그널의 종류에 따라 동작을 취할 뿐이다.
-> 시그널은 단방향 통신이라, 시그널을 보내는 쪽은 시그널이 제대로 처리되었는지 알 수 없다.
소켓은 보낸 데이터를 수신 측에서 가져가지 않으면 큐에 데이터가 차곡차곡 쌓인다. 이렇게 쌓인 데이터는 나중에 수신 측에서 한꺼번에 처리할 수 있다. 큐의 크기보다 많은 데이터가 쌓이지만 않으면 데이터가 유실되지도 않고 데이터의 순서도 변함이 없다.
하지만, 시그널은 소켓처럼 큐에 쌓이지 않는다. 프로세스가 수신한 각 시그널은 종류에 따라 독립적으로 처리된다. 같은 종류의 시그널이 중복해서 수신되면 중복 시그널은 손실되고, 종류가 다른 시그널은 프로세스에 정상 수신된다.