Что означает код возврата posix_spawn 14 "Bad Address"? - PullRequest
1 голос
/ 16 апреля 2019

Я порождаю дочерний процесс из моего приложения:

    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

PID, возвращенный после вызоваposix_spawn допустим, и intRC возвращает 2.

Однако я не вижу процесса, указанного в «Мониторе активности», родительский процесс указан, но не дочерний.

Где он и как можноЯ вижу вывод из консоли, поскольку он не отображается в той же консоли, что и родительский процесс.

[править] Может показаться, что «posix_spawn» не поддерживает порождение с использованием префикса пути »~", поэтому я попробовал полный путь:

/Users/Simon/XMLMPAM/config/modules

Я наблюдал в отладчике, и теперь возвращаемое значение равно 14, что согласно списку ошибок" Bad Address ".

[edit2] Как отметил Дэвид Шварц, он не работал, потому что я не инициализировал ppEnviron.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Решение этой проблемы было указано «Дэвидом Шварцем» в комментарии к вопросу.

Сбой операции spawn, поскольку указатель на среду не был инициализирован как NULL.

0 голосов
/ 16 апреля 2019

EFAULT (14) означает, что один из переданных вами аргументов является неверным адресом. Обычно вы можете распечатать все указатели, прежде чем передавать их, чтобы убедиться, что они указывают на действительную память.

Эта строка особенно подозрительна:

pfileActionsp = pAttr = nullptr;

Справочная страница говорит:

Аргумент attrp указывает на атрибуты объектов, которые указывают различные атрибуты созданного дочернего процесса. Этот объект инициализируется и заполняется до вызова posix_spawn() с помощью posix_spawnattr_init(3) и функции posix_spawnattr_*().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...