如何在不修改程序的情况下通过fork启动一个进程的两个实例

我试图从一开始就从另一个进程中分离出一个进程。 为此,我试图修改glibc中的__libc_start_main函数(我使用了一个修改后的glibc),并试图将fork放在那里,但是无法编译glibc,因为每当我尝试这样做的时候都会报错。 什么是其他选项,为什么在__libc_start_main中插入fork不起作用?

再次注意到我想以一种不需要程序修改的方式来完成,那就是glibc中的修改是可以的,但不是程序。

__libc_start_main ,我尝试像这样分叉。

 if (__builtin_expect (! not_first_call, 1)) { struct pthread *self; fork(); // <-- here self = THREAD_SELF; /* Store old info. */ unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup); /* Store the new cleanup handler info. */ THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf); /* Run the program. */ result = main (argc, argv, __environ MAIN_AUXVEC_PARAM); } 

我得到的错误是以下。

 file '/build/sunrpc/xbootparam_prot.T' already exists and may be overwritten make[2]: *** [build/sunrpc/xbootparam_prot.stmp] Error 1 

如果你静态地链接到一个不可修改的对象与主入口点,你可以使用符号包装偷偷对象的main()之前的fork()。

例如,不能修改的main.o:

 #include <stdio.h> int main( int argc, char *argv[] ) { printf( "In main()\n" ); return 0; } 

glibc中的包装符号:

 #include <unistd.h> #include <stdio.h> int __wrap_main( int argc, char *argv[] ) { printf( "In wrapper\n" ); if ( fork() ) { return __real_main( argc, argv ); } else { printf( "Other process did something else\n" ); return 0; } } 

并使用–wrap命令链接器命令:

 gcc -o app main.o wrap.o -Wl,--wrap=main $ ./app In wrapper In main() $ Other process did something else