2014-07-05 6 views
0

C 프로그램에서 다른 프로그램을 시작하고 쉘과 PID를 반환하고 싶습니다. 여기 제가 시도한 바가 있습니다.C에서 다른 프로그램 실행

struct app_names{ 

const char *run_args[TOTAL_NUM_APP] = { 
    " inp.in", 
    " 3000 reference.dat 0 0 100_100_130_ldc.of", 
} 


const char *run_exe[TOTAL_NUM_APP] = { 
    "./mcf", 
    "./lbm" 
} 
}; 
struct app_names SPEC_RUN; 



pid_t child; 
child = fork(); 
char RUN_EXE[2048] = "";   
strcat(RUN_EXE, SPEC_RUN.run_exe[0]); 
strcat(RUN_EXE, EXE_SUFIX); 
strcat(RUN_EXE, SPEC_RUN.run_args[0]); 

if(!child) 
    execlp(SPEC_RUN.run_exe[0], SPEC_RUN.run_exe[0], SPEC_RUN.run_args[0], (char *)0); 

내가 정확히 여기에 누락 되었습니까? 왜 프로그램을 시작하지 않습니까?

+0

그것은 아마 내가 본 동안 이상한 구조이다. 그 너머 (그리고 끔찍한 버퍼 오버플로가 strcats에 고정 크기 버퍼로 위험 함) execlp의 반환 값을 확인 했습니까? – jcaron

+1

'strerror (errno)'값을 확인하십시오. 또한, 구조체 C 유효한 코드가 무엇입니까? – Jack

+1

당신은 GDB를 실행하고 당신이 패스 한'execlp' parms과 실패했을 때'errno'의 값을 확인하기 위해 30 초 내에 이것을 풀 수 있습니다. 이 질문을 입력하는 데 걸리는 시간보다 짧은 시간이 걸렸을 것입니다. – Duck

답변

2

프로그램에서 오류를 확인하지 않기 때문에 잘못 찾지 못했습니다. 당신은 모든 곳에서 오류를 확인해야합니다 :이 프로그램을 실행

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main (void) 
{ 
    pid_t child; 
    int status; 

    child = fork(); 

    if (child == -1) { 
    perror("Unable to fork"); 
    exit(EXIT_FAILURE); 
    } 

    if (child == 0) { 
    if (execlp("echo", "echo", "hello", NULL) < 0) { 
     perror("Unable to execute child"); 
     _exit(EXIT_FAILURE); 
    } 
    } 

    printf("Waiting for child..."); 

    if (wait(&status) < 0) { 
    perror("Unable to wait for child"); 
    exit(EXIT_FAILURE); 
    } 

    printf("Done. Child returned: %d\n", status); 

    exit(EXIT_SUCCESS); 
} 

을 제공합니다

./run 
hello 
Waiting for child...Done. Child returned: 0 

변경에 간부 라인 : 때 execlp ("무효", "무효", "무효", NULL) 및 그것은 줄 것이다 :

./run 
Unable to execute child: No such file or directory 
Waiting for child...Done. Child returned: 256 
+0

고마워. 시도해보고 대답을 수락하겠습니다. – user3808088

+0

다음 메시지가 나타납니다 :'자식을 실행할 수 없습니다. ' – user3808088

+0

오류가 계속 발생하면 실행하려는 파일에 실행 비트 (chmod + x)를 설정해야 할 수 있습니다. – Matt