2010-12-03 5 views
0

C 코드에서 셸을 어떻게 실행합니까? 그러나C 코드에서 셸을 제어 하시겠습니까?

system("/bin/sh -i"); 

:

은 내 쉘은 어쩌면 당신이 상호 작용해야 쉘 말할 필요 나

system("/bin/sh"); 
exec("/bin/sh"); 
+0

작동하지 않았습니까? 그것에 대해 자세히 설명해 주시겠습니까? 그리고 임원 계열의 기능 중 어느 것을 사용 했습니까? – vpit3833

+0

어떻게됩니까? 더 자세한 내용은 please – Drakosha

+0

사실 내가 그 명령 중 하나를 사용하지 않고 내 C 코드를 실행하면 내 코드가 대기 상태 (그게 내가 사용하는 C 응용 프로그램의 특성 때문에)의 일종으로 간다. 대기 상태로 들어가기 전에이 명령을 시도했지만 쉘 프롬프트가 표시되지 않습니다. – baltoro

답변

2

을 위해 작동하지 않았다 /bin/sh

다음에 위치 , 나는 원래 system() 호출도 쉘 프롬프트를 생성해야한다고 생각합니다.

모두 표기 (로하고 '-i'제외)이 프로그램은 ('출구'와 RETURN 또는 제어-D 입력하여 이전 쉘로 복귀), 나에게 쉘 프롬프트를 제공 :

을 -i 리디렉션 문제의 일종이 발생하여

int main() 
{ 
    int ret = system("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

모든 것이 최대한 빨리 출력을 생성하는 명령을 입력 할 때 응답 : 나를 위해 예상대로

#include <stdlib.h> 
int main(void) 
{ 
    system("/bin/sh -i"); 
    return 0; 
} 
1

이 프로그램은 작동합니다.

exec() 사이에 중요한 차이가 있습니다. 원하는 명령이 실행되기 때문에 먼저 불필요한를 시작하여,

는 거의 사용되지 이유는
/bin/sh -c /bin/sh 

과 동일한 system("/bin/sh") 있도록 효과적으로 명령 줄에서 /bin/sh -c yourCommand과 동일() 시스템, 쉘 프로세스. 이 때문에 실행되지 않았을 것입니다 후

int main() 
{ 
    int ret = exec("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

의 printf() 모든 것을 :

간부는() 전체 프로세스 이미지의 원인의 I가 쓴, 그래서 만약 지정된 명령으로 대체 할 전체 프로세스는 /bin/sh의 인스턴스로 변환됩니다. 자식 명령을 실행하는 올바른 방법은 자식을 fork 한 다음 exec하고 부모를 기다리는 것입니다.