重新实现库函数

时间:2017-03-12 05:28:54

标签: c linux system

我有这个函数用于运行带错误检查的子进程。但是我需要这个代码用于不同的操作系统(xv6),它不支持fcntlgetrlimit。我该如何重新实现它们?或者还有其他方法吗?

pid_t run_child(char *progname, char *argv[], int child_stdin, int child_stdout, int child_stderr)
{ pid_t child;
  struct rlimit lim;
  int max;

  if((child=fork()))
  { 
    return child;
  }

  if(child_stdout==STDIN_FILENO)
  { 
    child_stdout=dup(child_stdout);
    RC_CHECK(child_stdout>=0);
  }

  while(child_stderr==STDIN_FILENO || child_stderr==STDOUT_FILENO)
  { 
    child_stderr=dup(child_stderr);
    RC_CHECK(child_stderr>=0);
  }

  child_stdin=dup2(child_stdin,STDIN_FILENO);  
  RC_CHECK(child_stdin==STDIN_FILENO);
  child_stdout=dup2(child_stdout,STDOUT_FILENO);  
  RC_CHECK(child_stdout==STDOUT_FILENO);
  child_stderr=dup2(child_stderr,STDERR_FILENO);  
  RC_CHECK(child_stderr==STDERR_FILENO);

  RC_CHECK(getrlimit(RLIMIT_NOFILE,&lim)>=0); 
  max=(int)lim.rlim_cur;

  for(int fd=STDERR_FILENO+1; fd<max; fd++)
  { int code=fcntl(fd,F_GETFD);

    if(!code&FD_CLOEXEC) 
    { if(fcntl(fd,F_SETFD,code|FD_CLOEXEC)<0)
        perror("run_child"); /* Report errors, but proceed */
    }
  }

0 个答案:

没有答案