gpt4 book ai didi

c - 将 fork 进程输出重定向到 NULL

转载 作者:IT王子 更新时间:2023-10-29 01:17:49 26 4
gpt4 key购买 nike

我需要创建一个函数,其中包括生成一个子进程。我想向此函数传递一个可选的文件描述符列表,以便根据用户需要重定向子进程的输入/输出。

我看到很多人都在谈论如何使用 dup2 来做到这一点,有点像这样:

if( pid < 0 )   // error forking.
{
//...
}
else if( pid != 0 ) // Parent process.
{
ret = waitpid( pid, &status, 0 );
return WEXITSTATUS( status );
}
else // Child process.
{
dup2( fd, STDIN_FILENO ); // Clone passed file discriptor.
close( fd ); // Close the passed one, since we have already cloned.
execvp( arglist[ 0 ], arglist );
}

好的。所有这些都在互联网上。我现在的问题是,如何(或最好的方法)重定向到 /dev/null

我应该强制用户打开(/dev/null)并将其作为fd传递还是有更好的方法?


编辑:

这不像我想要的那样漂亮,但我找不到任何更好的方法,所以我最终将一个文件名数组传递到用户可能想要重定向的任何地方,分别是 STDIN、STDOUT 和 STDERR:

static int  do_exec( arglist_t arglist, const char *fio[ 3 ] )
{
DEBUG__( OSU_DEBUG_LEVEL_1, "fio = %p\n", fio );

if ( fio )
{
if ( fio[ STDIN_FILENO ] )
{
int fd = open( fio[ STDIN_FILENO ], O_RDONLY );

if ( -1 < fd )
{
dup2( fd, STDIN_FILENO );
close( fd );
}
}

if ( fio[ STDOUT_FILENO ] )
{
int fd = open( fio[ STDOUT_FILENO ], O_WRONLY | O_CREAT | O_APPEND );

if ( -1 < fd )
{
dup2( fd, STDOUT_FILENO );
close( fd );
}
}

if ( fio[ STDERR_FILENO ] )
{
int fd = open( fio[ STDERR_FILENO ], O_WRONLY | O_CREAT | O_APPEND );

if ( -1 < fd )
{
dup2( fd, STDERR_FILENO );
close( fd );
}
}
}

return execvp( arglist[ 0 ], arglist );
}
  • 我还没有完全测试它,所以它可能有一些错误。

非常感谢@Zack 和@gbulmer。

最佳答案

您可以将它作为您的 API 的约定,为 fd 传递 -1 意味着使用 /dev/null,然后执行

// ... same as you have ...

else // Child process
{
if (stdin_fd == -1)
stdin_fd = open("/dev/null", O_RDONLY);
if (stdin_fd == -1)
_exit(127);
dup2(stdin_fd, STDIN_FILENO);
close(stdin_fd);

// similarly for stdout and stderr

execvp(arglist[0], arglist);
_exit(127);
}

(嘘:每次你在括号内放置空格时,上帝都会杀死一只小猫。)

关于c - 将 fork 进程输出重定向到 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com