Fork:child不执行代码

时间:2014-04-17 08:04:41

标签: c

我尝试通过fork启动一个新进程,但有时孩子不会执行他的代码。当我发起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 );
    }
}

1 个答案:

答案 0 :(得分: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};