Raku의 X::Proc::Async::BindOrUse — 이미 쓰이는 핸들을 또 바인딩할 때
Raku의 X::Proc::Async::BindOrUse — 이미 쓰이는 핸들을 또 바인딩할 때
외부 프로세스와 연결을 다루다 보면, 한 핸들을 두 방향으로 동시에 쓰려는 실수를 하기 쉬워요. 그럴 때 Raku가 던지는 예외가 X::Proc::Async::BindOrUse예요. 클래스 선언은 다음과 같아요.
class X::Proc::Async::BindOrUse does X::Proc::Async {}
어떤 상황에서 나는지 예시로 보면 금방 와닿아요. 두 방향을 모두 쓰도록 만들고 그 위에 stdin까지 바인딩하면 오류가 나죠.
my $p = Proc::Async.new("ls", :w);
my $h = "ls.out".IO.open(:w);
$p.bind-stdin($h);
# Fails with OUTPUT: «Cannot both bind stdin to a handle and also use :w»
이 경우 stdin은 이미 바인딩되어 있어서 다시 쓸 수 없어요. 흐름이 서로 안 맞으면 이 예외가 발생하는데, 핸들 하나는 :out으로, 다른 하나는 :w로 흐르게 만들면 제대로 동작해요.
본문
이 예외는 대체로 스트림이 흐르는 방향에 뭔가 잘못이 있을 때 발생해요. 프로세스 표준 입력·출력을 바인딩할 때 방향이 겹치지 않도록만 신경 쓰면 피할 수 있어요.