dlmopen вызывает ошибку zmq "Прерванный системный вызов" - PullRequest
2 голосов
/ 13 января 2020

Я пытаюсь использовать dlmopen() для запуска одного и того же файла .so с несколькими экземплярами.
Поскольку общий объект включает в себя несколько stati c методов, я должен использовать dlmopen() для создания надлежащих экземпляров.
Для каждого экземпляра (все в одном потоке, если это имеет значение) в конструкторе, который я использую:

handle_ = dlmopen(LM_ID_NEWLM, "path_to_so", RTLD_LAZY | RTLD_DEEPBIND);

и я не получаю ошибок, я даже могу использовать dlsym() для вызова функций из файла so:

int (*function_name)(int, const char *);
function_name = (int (*)(int, const char *))(unsigned long)dlsym(handle_, "function_name");

То, что происходит, когда я пытаюсь использовать любой вид " zmq send"(прием работает хорошо) Я получаю:

terminate called after throwing an instance of 'zmq::error_t'
what(): Interrupted system call

даже после моего завершения объект dlmopen() и объект, который их создал.

Кто-нибудь сталкивался с такой проблемой? Я безуспешно пытался изменить флаги dlmopen().

Это код для zmq_send ():

    inline size_t send (const void *buf_, size_t len_, int flags_ = 0)
    {
        int nbytes = zmq_send (ptr, buf_, len_, flags_);
        if (nbytes >= 0)
            return (size_t) nbytes;
        if (zmq_errno () == EAGAIN)
            return 0;
        throw error_t ();
    }
...