fork()和sys_fork()的区别

3

我看到所有系统调用(比如x)都与另一个叫做sys_x()的调用相关联: 例如:fork和sys_fork(),open()和sys_open()等。

这些sys_x()调用的意义是什么?我们在哪里可以使用这些调用?

2个回答

4
这些sys_x()调用有什么意义?
正如名称所示,这些是在内核模式下执行的实际系统调用。
当您从应用程序中调用fork(2)或open(2)时,您并未直接调用原始的系统调用;相反,您调用了glibc的包装器,它们知道如何调用实际的系统调用。这个间接步骤是必要的,因为系统调用的调用是与体系结构相关的,因此细节被隐藏在glibc中。
我们能在哪里使用这些调用?
你不能。首先,sys_fork()是Linux特定的;其他UNIX变体不需要(也可能不需要)实现sys_fork()函数。处理分叉的内核中确切的函数取决于系统。恰好在Linux中有一个名为sys_fork()、sys_open()等的函数。
例如,在fork(2)的情况下,在Linux中流程更多地是:
fork() -> glibc wrapper -> 原始系统调用调用 -> 过渡到内核模式 -> 系统调用查找 -> sys_fork() -> do_fork()。

0
这是一个使用 sys_fork() 会很有用的例子。
Mono .net 运行时尝试将调试器作为其崩溃处理程序的一部分运行。Unix 上的信号处理程序只能运行异步安全函数,否则可能会发生死锁。因此,Mono 避免使用 fork(),而是直接发出系统调用:
#if !defined (HOST_WIN32)
/**
 * fork_crash_safe:
 *
 * Version of \c fork that is safe to call from an async context such as a
 * signal handler even if the process crashed inside libc.
 *
 * Returns 0 to the child process, >0 to the parent process or <0 on error.
 */
static pid_t
fork_crash_safe (void)
{
    pid_t pid;
    /*
     * glibc fork acquires some locks, so if the crash happened inside malloc/free,
     * it will deadlock. Call the syscall directly instead.
     */
#if defined(HOST_ANDROID)
    /* SYS_fork is defined to be __NR_fork which is not defined in some ndk versions */
    g_assert_not_reached ();
#elif !defined(HOST_DARWIN) && defined(SYS_fork)
    pid = (pid_t) syscall (SYS_fork);
#elif HAVE_FORK
    pid = (pid_t) fork ();
#else
    g_assert_not_reached ();
#endif
    return pid;
}
#endif

https://github.com/mono/mono/blob/1da2d9803f4e8816a41a2d1aba65ed9011791b83/mono/mini/mini-posix.c#L1040


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接