我有这个函数用于运行带错误检查的子进程。但是我需要这个代码用于不同的操作系统(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 */
}
}