posix_spawn返回代码14“错误地址”是什么意思?

时间:2019-04-16 05:39:42

标签: posix

我正在从应用程序中生成一个子进程:

    QString strFullPath(strModulesPath 
                      + strModule.toString());
    QByteArray baFullPath(strFullPath.toLatin1())
              ,baSeconds((QString::number(lngSeconds))
                       .toLatin1());
    char** ppEnviron
        ,* pszFullPath = baFullPath.data()
        ,* pszSeconds = baSeconds.data()
        ,* paryszArgs[] = {pszFullPath
                          ,pszSeconds
                          ,nullptr};
    posix_spawn_file_actions_t* pfileActionsp;
    posix_spawnattr_t* pAttr;
    pid_t pid = 0;
    pfileActionsp = pAttr = nullptr;
    int intRC = posix_spawn(&pid
                           ,pszFullPath
                           ,pfileActionsp
                           ,pAttr
                           ,paryszArgs
                           ,ppEnviron);

要启动的应用程序在baFullPath中指定,并且包含:

~/XMLMPAM/config/modules/mdFileIO

调用posix_spawn后返回的pid是有效的,并且intRC返回2。

但是,我看不到“活动监视器”中列出的进程,但列出了父进程,但没有列出子进程。

它在哪里,以及如何从控制台看到输出,因为它与父进程不在同一个控制台中。

[edit]似乎“ posix_spawn”不支持使用路径前缀“〜”生成,因此我尝试了完整路径:

/Users/Simon/XMLMPAM/config/modules

我在调试器中看到了,现在返回值为14,根据错误列表,该返回值为“错误地址”。

[edit 2]正如David Schwartz指出的那样,它没有用,因为我没有初始化“ ppEnviron”。

2 个答案:

答案 0 :(得分:0)

EFAULT(14)表示您传递的参数之一是无效的地址。通常,您可以在传递所有指针之前先打印所有指针,以确保它们指向有效内存。

此行特别令人怀疑:

pfileActionsp = pAttr = nullptr;

man page说:

  

attrp参数指向一个属性对象,该对象指定             创建的子进程的各种属性。这个对象是             在posix_spawn()调用之前使用进行了初始化和填充             posix_spawnattr_init(3)posix_spawnattr_*()函数。

答案 1 :(得分:0)

“ David Schwartz”在对该问题的评论中指出了解决该问题的方法。

生成操作失败,因为指向环境的指针未初始化为NULL。