2012-08-03 4 views
-1

취미로 Linux에서 기본 셸을 작성 중이므로 프로그램 실행을 시작하려고하지만이 작업을 수행하는 방법에 대해서는 알지 못합니다. 나는 execp()과 다양한 형제와 자매를 보았지만 분명히 커널이 현재 실행중인 프로세스 (이 경우에는 쉘)를 삭제하고 새 프로세스를 계속 수행하도록합니다.내 C 프로그램과 다른 프로그램 실행

기본적으로 내가 필요한 것은 ls 또는 cd과 같은 명령을 호출하여 실행하고 내 셸로 돌아갈 수있는 함수입니다.

모든 도움을 주실 수 있습니다.

답변

1

fork으로 새 프로세스를 만들고 exec을 호출하십시오. 이 같은

+0

좋아, 쉘의 새로운 인스턴스를 만들거나 그냥'fork'를 사용하여 간단한 프로그램을 만들고 그 프로세스에서'exec' 함수를 호출하면된다. 그렇다면 믿을 수 없다고 생각합니다. 감사합니다. –

+0

먼저 포크 한 다음 exec 명령을 사용하여 원하는 명령을 호출하십시오. 이것은'cd'에서는 작동하지 않는다는 것에주의하십시오. – JeremyP

+0

감사합니다. 몇 가지 제안 사항을 얻은 다음 각 방법을 테스트 할 것입니다. –

1

사용 무언가 :

if (fork()==0) { 
    execl ("/bin/sh",NULL); 
} 

이 새로운 프로세스 (이미 하나를 실행의 정확한 복사본)를 만듭니다는 다음 새 것으로 교체. CPU가 가상 메모리를 완전히 지원하지 않는 환경에서 일부 해결 방법이 필요할 수 있으며 원본 프로세스가 너무 커서 복제 할 수없는 경우가 있습니다.

+0

당신의 경우'/ bin/sh'에있는 새로운 프로세스의 결과를 STDOUT으로 출력합니까? –

+0

예, 새로 실행 된 프로세스 (즉, STDOUT 및 STDIN)의 콘솔은 원래 프로세스와 동일합니다. – Senna

+0

좋아요, 그럼 일종의 일하는 것 같습니다. 함수를 호출 할 때이 오류가 발생합니다. argv [0]이 (가) exec 시스템 호출을 통해 전달되었습니다. 이것은'execl()'함수에서'ls' 명령을 호출 중입니다 ... –

2

ouah의 대답은 본질적으로 정확하지만 cd에 대해서는 작동하지 않습니다. 귀하의 쉘은 쉘이 cd에 대한 코드를 포함해야합니다 즉, (A 내장 명령과 그 구현해야합니다.

그 이유는 첫째 fork은 (쉘의 실행중인 인스턴스를 현재 프로세스의 새 복사본을 생성하는 것입니다, exec는 실행하고자하는 실행 파일로 새 프로세스를 덮어 씁니다. 명령이 끝나면 새로운 프로세스가 종료되고 사라집니다. cd에 이것을 사용하면 새 프로세스의 작업 디렉토리가 변경되지만 남겨 둡니다.

+0

아, 지금 당신이 의미하는 바를 봅니다. 나는 fork() 함수에 대해 더 많은 연구를 할 것이다. –

관련 문제