2014-04-17 4 views
1

포크를 통해 새 프로세스를 시작하려고 시도하지만 때로는 자식이 코드를 실행하지 않습니다. ps을 실행하면 새 아이를 볼 수 있습니다.포크 : 자식이 코드를 실행하지 않습니다.

if(stream_pid == 0)을 평가하기 전에 자식 프로세스가 중지되거나 대기중인 것과 같습니다.

이 임의의 문제를 어떻게 해결할 수 있습니까?

내가 150MHz의에서 ARM의 SoC에이 코드를 실행

은 (는 도움을 줄 수 있는지 알고하지 않습니다 : P)

static void process_thread_func(void) 
{ 
    const char *ret = NULL; 
    char *argv[2]; 
    char *status = NULL; 
    int stream_pid; 
    int flag = 0; 
    int err = 0; 

    stream_pid = fork(); 

    if(stream_pid == 0) 
    { 

     argv[0] = "/usr/bin/mplayer"; 
     argv[1] = "tv:// -tv driver=v4l2:device=/dev/video0:outfmt=y8:width=320:height=240"; 
     argv[2] = NULL; 

     err = execv("/usr/bin/mplayer" , argv); 

     if(err < 0) 
      printf("execv failed, reason: %d\n", errno); 

    } 
    else if(stream_pid < 0) 
     printf("Cannot create mplayer child, reason: %d\n", errno); 
    else 
    { 
     (void)waitpid(stream_pid, &flag, 0); 
    } 
} 
+0

이 숯불 *의 변수는 argv [2]'변경해보십시오;'의 char *의 변수는 argv [3]'에;' – user3386109

답변

4

당신은 argv 배열의 범위를 벗어난 쓰고있어, 당신은 선언하지 않았기 때문에 그것은 충분히 크다. 그것은해야한다 : 인수가 하드 코딩 된 프로그램에 있기 때문에

char *argv[3]; 

당신은 대신 execl을 사용할 수 있습니다.

err = execl("/usr/bin/mplayer", "/usr/bin/mplayer", "tv:// -tv driver=v4l2:device=/dev/video0:outfmt=y8:width=320:height=240", (char*) NULL); 

아니면 초기화에서 자동 배열 크기 자체를 할 수 있습니다 :

char *argv[] = {"/usr/bin/mplayer", "tv:// -tv driver=v4l2:device=/dev/video0:outfmt=y8:width=320:height=240", NULL}; 
관련 문제