我尝试通过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 );
}
}
答案 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};