在共享库中使用fork
通常可以安全地从另一个主机进程调用吗?
共享库将进行fork以便并行执行一个过程(除了线程之外,还有对分叉进程具有单独内存空间的额外保护),然后在退出过程之前终止分叉进程。
如果主机可执行文件暂时重复,是否会产生任何副作用?
还有办法使用CreateProcess
将其移植到Windows吗?
答案 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会将整个批次删除,这不是一个好结果。