2010-08-09 2 views
4

펄이 라인은 다음과 같습니다

open my $fh_echo, '-|' or exec "$sshstr \"$str\""; 

기본적으로 간부의 $ sshstr 다음 출력이 어떻게 든 $ fh_echo로 이동합니다. 나는이 작전의 배후에있는 메커니즘에 관해서 궁금하다. 누군가가 '- |' 방법?

어떻게 출력을 $ fh_echo에로드합니까? 그것을 조금씩 출력하거나 $ fh_echo는 단순히 exec의 출력을 처리합니까?

하하 나는이 사촌도 할 수 없다. 결과에 나타나지 않는다.

답변

4

perlfork을 참조하십시오. 파이프가 열리는 포크입니다.

기본적으로 |- 파이프는 분기 된 자식 프로세스로 출력되고 -|은 부모 프로세스에서 (자식 프로세스 내에서) 읽습니다. perldoc -f open에서

:

명령에 파이프를 열 경우 '-', 즉를 하나 '| -'또는 '- |' open()의 2- 인수 (또는 1- 인수) 형식을 사용하면 암시 적 포크 완료가 발생하고 반환 값은 부모 프로세스 내의 자식 pid 및 자식 프로세스 내의 0입니다.

예를 들어, 하위 프로세스에서 읽은 다음 하위에서 분기하고 $sshstr으로 바꾸는 파이프를 여는 것입니다.

+0

오오 기본적으로 자식 프로세스의 출력을 가져옵니다.이 출력은 exec이며 $ fh_echo를 해당 출력의 핸들로 설정합니다. 이것은 버퍼링 된 프로세스입니까? 아니면 동기인가? –

+0

이것은 버퍼 처리 된 핸들이므로'$ |'를 설정해야합니다. –

+0

open()은 오른쪽을 제공해야하기 때문에이 예제에서 항상 실패합니다. 그래서 위의 코드는 항상 exec (qq [$ sshstr "$ str"])를 호출하여 종료된다는 것을 의미합니다. –

2

open my $fh_echo, "-|", "$sshstr \"$str\""과 같은 일을하는 것 같습니다. 일이 성공적으로 열릴 때

exec qq[$sexec qq[$sshstr "$str"] unless open my $fh_echo, '-|' 

출력은 정말 $ fh_echo이 방식에 의한 개방의 가장 오른쪽 인수에 실행 파일의 출력()와 핸들되고, $ fh_echo에로드되지 않은 : 그것은으로 deparses 파이프 라인의 파이프 라인에 대한 자세한 내용은 wikipedia page을 확인하십시오. 그러나 주어진 예제는 아무 것도 열지 않는다는 것을 지적해야합니다. 제공 한 예제의 오른쪽에 명령이 없으므로 open()은 항상 실패를 나타내는 true가 아닌 값을 반환하고 표현식의 오른쪽은 항상 실행됩니다. http://ideone.com/wupJ8

더 자세한 내용은 성공하려면 open my $f, "-|", "echo hi"을 사용하는 것이 좋습니다.

pipe my $fh_echo, my $childout; 

if (fork == 0) { 
    close STDOUT; 
    open STDOUT, ">>&", $childout; 

    exec "echo hi"; 
} 

이 먼저 포크 파이프를 생성하고 :이 명령을 주면 다음이 대략 동등하게, 파이프의 우측 인 것으로 자식 프로세스에 stdin을 재정의한다. 자식 프로세스에서 stdout은 파이프의 쓰기 측으로 다시 정의됩니다. 그러면 현재 프로세스를 주어진 프로세스로 대체하는 exec이 호출됩니다 (자세한 내용은 exec (2) 참조). 그 시점부터 stdout이 파이프의 쓰기 가능한면으로 재정의 되었기 때문에 stdout에 대한 모든 출력은 실제로 대상이 이전에 있던 파이프가 아닌 파이프에 실제로 기록됩니다.

또한 정규화 된 실행 파일 경로가 아니므로 exec "echo hi"결함을 쉘에 더 자세히 설명합니다. 즉, perl은 주어진 표현이 실제로 무엇을 의미하는지 결정하지 않기로 결정했기 때문에 실제로는 perl에 의해 exec "/bin/sh", "echo hi"으로 읽혀집니다.

희망 사항은 그 역학을 설명합니다.

+0

하하는 다른 답변에 대한 의견에 의해 지적 된 작은 것을 제외하고는 매우 상세한 설명을 제공합니다. 상관없이, 고마워! 기본적으로 AJAX 호출에서 $ str 스크립트의 결과를 피드백하는 코드에는이 줄이 있습니다. 그러나 버퍼링과 임의의 문제로 인해 cgi 스크립트가 시간 초과되는 경우가 있으므로 메커니즘을 궁금해하여 주변을 조정할 수 있습니다. 그러나 회고록에서 나는 AJAX 헤더를 변경하여 연속 요청을 허용하거나 만료 시간을 최소로 줄여야 할 가능성이 큽니다. –

+0

$ sslstr 또는 $ str을 동적으로 빌드하지 않고 CGI 스크립트에서 syscall을 만들기 위해이 스크립트를 사용하기를 바랍니다. 그것은 매우 위험합니다. –

+0

음 .. 나는 부분적으로 그렇다. 그러나, 나는 코드 조각에 관련된 더 많은 유가 증권을 내 발췌 문장에서 제외 시켰습니다. –

관련 문제