我一直试图弄清楚如何在Linux内部使用fork-exec机制.根据计划,一切都在继续,直到一些网页开始让我困惑.
据说,一个子进程应该严格使用_exit()而不是简单exit()或正常的返回main().
据我所知,Linux shell fork-execs每个外部命令; 假设我上面说的是真的,结论是这些外部命令和Linux shell中发生的任何其他执行都不能正常返回!
维基百科和其他一些网页声称,我们必须使用_exit()它来防止子进程导致删除父进程的临时文件,同时可能会发生stdio缓冲区的双重刷新.虽然我理解前者,但我没有任何线索如何双重刷新缓冲区可能对Linux系统有害.
我花了一整天的时间......感谢任何澄清.
我们使用g ++ 4.2.4,我试图在我的代码中追踪一些性能问题.
我正在运行gprof来生成配置文件,我得到以下"奇怪",因为最昂贵的功能是__tcf_0:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
40.00 0.04 0.04 1 40.00 95.00 __tcf_0
Run Code Online (Sandbox Code Playgroud)
然后,此函数似乎调用了我的大多数用户函数(即,它是从main调用的函数).我在这里找到的最接近的解释是在这里,但该链接指的是静态对象和atexit,我不认为这适用于我的情况.
如果它有用,我正在使用Boost(program_options和fusion)和HDF5库.
更新:
我在构建时使用的命令是:
g++ -Wreturn-type -Wunused -Winline -pg -DLINUX -DHAS_SETENV \
-DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15 -g -O0 \
--param large-function-growth=300 --param inline-unit-growth=200
Run Code Online (Sandbox Code Playgroud) *修订问题(见下文)*
我有一个定义静态全局变量的cpp文件,例如
static Foo bar;
Run Code Online (Sandbox Code Playgroud)
此cpp文件被编译为可执行文件和共享库.可执行文件可以在运行时加载共享库.
如果我在Linux上,似乎有两个这个变量的副本.我假设一个来自可执行文件,另一个来自共享库.其他平台(惠普,Windows)似乎只有一个副本.
什么控制Linux上的这种行为,我可以改变它吗?例如,是否存在编译器或链接器标志,它会强制共享库中此变量的版本与可执行文件中的变量相同?
*问题的修订*
谢谢你到目前为止的答案.在重新审视问题时,实际上并不是上述问题.上面的静态全局变量确实在Windows上有多个副本,因此与我在Linux上看到的没有区别.
但是,我有另一个全局变量(这次不是静态的),它在cpp文件中声明,在头文件中声明为extern.
在Windows上,这个变量有多个副本,一个在可执行文件中,一个在每个dll中加载,而在Linux上它只有一个.所以现在的问题是关于这种差异.如何让Linux拥有多个副本?
(我的程序的逻辑意味着静态全局变量的值取决于非静态全局变量的值,我开始指责错误的变量是问题)
我undefined symbol动态加载库时遇到错误.这是我生成此错误的代码段:
int main ()
{
void *lib_handle = NULL;
MyClass* (*create)();
void (*destroy)(MyClass*);
char *error;
lib_handle = dlopen ("./libshared.so", RTLD_LAZY);
if (lib_handle == NULL)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
create = (MyClass* (*)()) dlsym(lib_handle, "create_object");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
destroy = (void (*)(MyClass*)) dlsym(lib_handle, "destroy_object");
MyClass *myClass = (MyClass*) create;
destroy(myClass);
dlclose(lib_handle);
}
Run Code Online (Sandbox Code Playgroud)
但是当我通过注释上面的代码并导出库路径来加载库时,一切都像魅力一样.
对于动态链接,我在命令提示符下使用以下命令.
g++ -Wl,--export-dynamic shared_user.cpp -ldl
任何帮助,将不胜感激.