c - fork : child does not execute code

标签 c

我尝试通过 fork 启动一个新进程,但有时 child 不执行他的代码。当我启动 ps 时,我可以看到新的 child 。

这就像子进程在评估 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 );
    }
}

最佳答案

你在 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};

关于c - fork : child does not execute code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127783/

相关文章:

c - 防止 GCC LTO 删除函数

c - pthread_cond_signal 会通知哪个线程?

c - 如何最好地处理 Windows 的 16 位 wchar_t 丑陋?

c - 反转字符串代码忽略空格

c++ - 保护定义的 C 宏

c++ - "const"只是意味着只读还是更多?

c - 请建议设计实现: dynamically updating list of items

c++ - 柔性/莱克斯 : Regular Expression matches double characters

C strncpy 2 字符

c - libncurses : non-blocking STDIN + select on socket