2012-01-11 2 views
2

나는 내가 프로세스를 실행 execlp를 사용때 execlp 여러 "프로그램"

cat file.tar | base64 | myprogram -c "| base64 -d | tar -zvt " 

같은 것을 실행하려는.

cat과 같은 것을 실행하려고하면 작동하지만 base64 -d | tar -zvt을 실행하면 작동하지 않습니다.

나는 bash 명령을 보았고 나는 bash를 실행하고 다른 프로그램을 실행할 수 있다고 알았다. 내가 터미널에서 실행하면 잘 작동하지만 execlp이 일을 해달라고 사용

execlp ("bash", "-c", "base64 -d | tar -zvt", NULL); 

: 그래서 같은 것이 있습니다. execlp("cat", "cat", NULL)을 사용하면 작동합니다.

누군가는 execlp에서 -c param을 사용하여 여러 "프로그램"을 실행하는 방법을 알고 있습니까? 파이프와 포크를 사용하기 때문에 시스템을 사용할 수 없습니다.

execlp ("bash", "bash", "-c", "base64", NULL)를 사용하려고하면 ... 아무 일도 일어나지 않습니다. execlp ("cat", NULL)을 사용하면 괜찮습니다. stdin에 쓰고 있습니다 ... bash -c base64의 문제인지 잘 모릅니다. 터미널 에코 "asd"| 그것은 잘 진행 "고양이"-c bash는

+1

[이전 답변] (http : // stackoverflow.질문/7281894/how-do-i-chain-stdout-in-one-child-process-st-in-another-child-in-c/7282296 # 7282296) 파이프와 프로세스. 희망이 도움이됩니다. –

+0

내가 그것에 대해 생각, 조금 내가 배수구와 함께 해결하기 위해 노력하고있어, 내가 할 수 없다면 내가 여러 파이프 방법을 시도합니다 : (... 감사합니다. – Lefsler

답변

4

첫 번째 "인자"는 같은으로 호출해야하므로, argv[0] 될 것입니다 : 위의 기능은 무엇

execlp("bash", "bash", "-c", "base64 -d | tar -zvt", NULL); 

편집 작은 설명 : exec 함수 계열은 프로그램을 실행합니다. 위의 호출에서 해당 프로그램은 "bash"(첫 번째 인수)입니다. Bash는 다른 모든 프로그램과 마찬가지로 프로그램의 시작 지점 인 main 함수를 가지고 있습니다. 다른 모든 main 함수와 마찬가지로 Bash의 함수는 일반적으로 argcargv이라는 두 개의 인수를받습니다. argv은 0으로 끝나는 문자열의 배열이고 argcargv 배열의 항목 수입니다. argc은 항상 1 이상이어야합니다. 즉, 항상 하나의 항목이 argv[0]에 있음을 의미합니다. 이 첫 번째 항목은 프로그램의 "이름"이며 대부분 프로그램 파일의 경로입니다. 명령 행의 다른 모든 프로그램 인수는 argv[1]에서 argv[argc - 1]에 있습니다.

execlp은 수행 할 프로그램을 찾기 위해 첫 번째 인수를 사용하고 다른 모든 인수는 지정된 순서대로 argv 배열에 배치됩니다. 제 경우

argv[0] = "bash" 
argv[1] = "-c" 
argv[2] = "base64 -d | tar -zvt" 

또한 배시 argc가 3

설정 될 것이다 : 이것은 execlp에 상기 호출 프로그램 "떠들썩한 파티"을 호출하고 이에 배시 argv 배열을 설정한다는 것을 의미 "bash""foo"으로 변경되면 Bash의 argv[0]"foo"으로 설정됩니다.

조금 더 지워줬으면합니다.

+0

왜 내가 배쉬를 2 번 호출해야합니까? – Lefsler

+1

@ user1109847 bash는 한 번만 호출 할 수 있지만 bash의'main()'함수에는 0 인수를 포함해야합니다. –

+0

bash를 사용하여 bash를 다시 호출 하시겠습니까? – Lefsler

관련 문제