コード例 #1
0
int
vsf_sysutil_fork_newnet()
{
#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE
  static int cloneflags_work = -1;
  if (cloneflags_work < 0)
  {
    cloneflags_work = vsf_sysutil_netns_cleanup_is_fast();
  }
  if (cloneflags_work)
  {
    int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL);
    if (ret != -1 || (errno != EINVAL && errno != EPERM))
    {
      if (ret == 0)
      {
        vsf_sysutil_post_fork();
      }
      return ret;
    }
    cloneflags_work = 0;
  }
#endif
  return vsf_sysutil_fork();
}
コード例 #2
0
ファイル: sysdeputil.c プロジェクト: schidler/flyzjhz-rt-n56u
int
vsf_sysutil_fork_isolate_failok()
{
#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE
  static int cloneflags_work = 1;
  if (cloneflags_work)
  {
    int ret = syscall(__NR_clone, CLONE_NEWPID | CLONE_NEWIPC | SIGCHLD, NULL);
    if (ret != -1 || (errno != EINVAL && errno != EPERM))
    {
      if (ret == 0)
      {
        vsf_sysutil_post_fork();
      }
      return ret;
    }
    cloneflags_work = 0;
  }
#endif
  return vsf_sysutil_fork_failok();
}