函数
GLibSpawnChildSetupFunc
描述 [src]
指定传递给 g_spawn_async()、g_spawn_sync()
和 g_spawn_async_with_pipes() 的 setup 函数的类型,此函数可以极少地影响子项执行。
在 POSIX 平台上,在 GLib 执行其计划执行的所有设置后,但在调用 exec() 之前,在子项中调用该函数。在此函数中执行的操作只影响子项,不影响父项。
在 Windows 中,在父项中调用该函数。因此,此函数在 Windows 中的用处可疑。在许多情况下,在父项中执行子项设置函数可能会产生不良影响,在将使用子项设置函数的软件移植到 Windows 时,应非常小心。
然而,即使在 POSIX 中,你从 GSpawnChildSetupFunc
所能安全执行的操作也会受到极大限制,因为在 fork()
时父进程中由其他线程持有的任何互斥锁仍会在子进程中处于锁定状态,并且永远不会解锁(因为持有这些互斥锁的线程在子项中不存在)。 POSIX 只允许在 fork()
和 exec() 之间在子项中调用异步信号安全函数(参见 signal(7)),这极大地限制了子项设置函数的实用性。
特别是,调用任何可能调用 malloc() 的函数都是不安全的,其中包括 setenv() 等 POSIX 函数。如果需要将子项环境与父项不同地设置,则应该使用 g_get_environ()、g_environ_setenv() 和 g_environ_unsetenv(),然后将完整环境列表传递给 g_spawn...
函数。