2016-11-29 67 views
1

在共享庫內部使用fork通常可以安全使用,它將從另一個主機進程調用?在共享庫中調用fork

共享庫將叉,以便並行地執行(與具有用於叉形過程獨立的存儲器空間,不同於螺紋的額外的保護)的程序,然後在退出程序之前殺死分叉處理。

如果主機可執行文件被臨時複製,是否會對主機可執行文件產生任何副作用?

還有一種方法將此端口移植到Windows使用CreateProcess

回答

1

在Linux上,fork()的規則在fork man page中列出。我不認爲從應用程序的核心調用fork()並從共享庫內調用它是有區別的。即,子進程仍然與父進程相同,只是它不會繼承父進程的內存鎖,異步I/O操作等。有關詳細信息,請參閱man fork

這是一個示例C程序,它提供了一個fork_wrapper()函數。

==> 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; 
} 
0

如果出口被稱爲共享庫和共享庫已被另一個程序加載然後退出需要一大堆下來,這是不是一個偉大的結果。