在共享库中调用fork

时间:2016-11-29 10:38:27

标签: multithreading shared-libraries fork

在共享库中使用fork通常可以安全地从另一个主机进程调用吗?

共享库将进行fork以便并行执行一个过程(除了线程之外,还有对分叉进程具有单独内存空间的额外保护),然后在退出过程之前终止分叉进程。

如果主机可执行文件暂时重复,是否会产生任何副作用?

还有办法使用CreateProcess将其移植到Windows吗?

2 个答案:

答案 0 :(得分:1)

在Linux上,fork man page概述了fork()的规则。我不相信在您的应用程序核心内调用fork()和从共享库中调用它之间存在差异。即,子进程仍然与父进程相同,除了它不会继承父内存锁,异步I / O操作等。有关详细信息,请参阅man fork。 p>

以下是一个提供fork_wrapper()函数的C程序示例。

==> fork_wrapper.h <==
#include <unistd.h>     // For fork(), etc.

pid_t fork_wrapper();

==> fork_wrapper.c <==
// To compile: gcc -c -fpic -o fork_wrapper.o fork_wrapper.c && gcc -shared -o libfork_wrapper.so fork_wrapper.o
#include <stdlib.h>     // For exit()
#include <stdio.h>      // For I/O
#include <string.h>     // For strerror(), memcpy(), etc.
#include <errno.h>      // For errors reported by 'nix system calls.
#include <unistd.h>     // For fork(), etc.

pid_t fork_wrapper()
{
    pid_t child = fork();
    if (-1 == child)
    {
        printf("fork_wrapper: fork(): error: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    else if (0 == child)
    {
        printf("fork_wrapper: fork(): succeeded (child)\n");
        exit(EXIT_SUCCESS);
    }
    else
    {
        printf("fork_wrapper: fork(): succeeded (parent)\n");
        return child;
    }
}

==> main.c <==
// To compile: gcc -L. -lfork_wrapper main.c -o main
#include "fork_wrapper.h"
#include <stdio.h>

int main(int argc, const char** argv)
{
    pid_t child = fork_wrapper();
    if (!child)
    {
        printf("fork_wrapper: waiting for child process\n");
        waitpid(-1, 0, 0);
    }

    return 0;
}

答案 1 :(得分:0)

如果在共享库中调用了exit,并且共享库已被另一个程序加载,那么exit会将整个批次删除,这不是一个好结果。