我正在从我的应用程序中生成一个子进程:
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,根据错误列表是“坏地址”。
[编辑2]正如David Schwartz指出的那样,它没有起作用,因为我没有初始化“ppEnviron”。
EFAULT(14)表示您传递的参数之一是无效地址。通常你可以在传递它们之前打印所有指针,以确保它们指向有效的内存。
这条线特别可疑:
pfileActionsp = pAttr = nullptr;
man page说:
attrp参数指向属性对象,该对象指定所创建的子进程的各种属性。在使用
posix_spawn()
和posix_spawnattr_init(3)
函数调用posix_spawnattr_*()
之前,初始化并填充此对象。
“David Schwartz”在对该问题的评论中指出了解决这个问题的方法。
生成操作失败,因为指向环境的指针未初始化为NULL。