Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 图书馆职能的重新落实_C_Linux_System - Fatal编程技术网

C 图书馆职能的重新落实

C 图书馆职能的重新落实,c,linux,system,C,Linux,System,我有这个函数用于运行带有错误检查的子进程。但是我需要为不同的操作系统(xv6)编写这段代码,因为它不支持fcntl和getrlimit。我应该如何重新实现它们?或者还有别的办法吗 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=f

我有这个函数用于运行带有错误检查的子进程。但是我需要为不同的操作系统(xv6)编写这段代码,因为它不支持
fcntl
getrlimit
。我应该如何重新实现它们?或者还有别的办法吗

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 */
    }
  }
pid\u t run\u child(char*progname,char*argv[],int child\u stdin,int child\u stdout,int child\u stderr)
{pid_t child;
struct-rlimit-lim;
int max;
if((child=fork())
{ 
返回儿童;
}
if(child\u stdout==STDIN\u FILENO)
{ 
child_stdout=dup(child_stdout);
RC检查(子对象>=0);
}
while(child_stderr==STDIN_FILENO | | child_stderr==STDOUT_FILENO)
{ 
child_stderr=dup(child_stderr);
RC检查(子标准>=0);
}
child\u stdin=dup2(child\u stdin,stdin\u FILENO);
RC\u检查(child\u stdin==stdin\u FILENO);
child\u stdout=dup2(child\u stdout,stdout\u FILENO);
RC_检查(子标准==标准文件号);
child_stderr=dup2(child_stderr,stderr_FILENO);
RC_检查(child_stderr==stderr_FILENO);
RC_检查(getrlimit(RLIMIT_NOFILE,&lim)>=0);
max=(int)lim.rlim\u cur;

对于(intfd=STDERR_FILENO+1;fdI会说答案取决于什么是“不同的操作系统”。“不同的操作系统”是xv6。请查看xv6的文档,以查看系统API是否提供了执行类似操作的任何函数。如果提供了,请使用它们来模拟该函数。如果没有提供,只需从函数中删除受影响的代码部分。如果没有提供,则具有不受支持函数的部分会在启动时要求内核关闭所有其他打开的文件xec,那么在这种情况下我应该删除它们吗?只要关闭您打开的任何文件(标准流除外),我会说答案取决于什么是“不同的操作系统”。“不同的操作系统”是xv6。请查看xv6的文档,以查看系统API是否提供了执行类似操作的任何函数。如果提供了,请使用它们来模拟该函数。如果没有提供,只需从函数中删除受影响的代码部分。如果没有提供,则具有不受支持函数的部分会在启动时要求内核关闭所有其他打开的文件在这种情况下,我应该删除它们吗?只需关闭您打开的所有文件(标准流除外)