gpt4 book ai didi

file - 在 fork() 之后将标准输出重定向到文件

转载 作者:行者123 更新时间:2023-12-01 16:09:29 36 4
gpt4 key购买 nike

我正在开发一个简单的 shell,但现在我只是想了解重定向。我只是硬编码 ls 命令并尝试将其写入文件。目前,ls 运行,并创建了输出文件,但输出仍然转到 stdout,文件为空。我对为什么感到困惑。提前致谢。

这是我的代码:

int main()
{
int ls_pid; /* The new process id for ls*/
char *const ls_params[] = {"/bin/ls", NULL}; /* for ls */
int file; /* file for writing */

/* Open file check user permissions */
if (file = open("outfile", O_WRONLY|O_CREAT) == -1) /* , S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP */
{
perror("Failed to open file");
_exit(EXIT_FAILURE);
}

ls_pid = fork(); /* Create new process for ls */

if (ls_pid == -1) /* error check */
{
perror("Error forking ls (pid == -1)");
_exit(EXIT_FAILURE);
}
else if (ls_pid == 0) /* Child of ls */
{
/* Redirect output to file */
if (dup2(file, STDOUT_FILENO) == -1) /* STDOUT_FILENO = 1 */
{
perror("Error duping to file");
_exit(EXIT_FAILURE);
}
close(file);

execvp("ls", ls_params); /* create the sort process */
/* execlp("ls", "ls", NULL); */

/* if this does not end the program, something is wrong */
perror("Exec failed at sort");
_exit(EXIT_FAILURE);
}
else /* ls parent (1) */
{
/* wait for child */
if (wait(NULL) == -1)
{
perror("fork failed on parent");
_exit(EXIT_FAILURE);
}
}

}

最佳答案

我没有发现任何问题。我自己试过你的代码。它有效!我的简化代码如下所示:

int main(void) {
int fd;

char* const param[] = {"/bin/ls", NULL};

fd = open("outfile", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

if (fd < 0) {
perror("open failed\n");
exit(0);
}

pid_t pid = fork();

if (pid < 0) {
perror("fork failed\n");
exit(0);
}
else if (pid == 0) {
dup2(fd, STDOUT_FILENO);

close(fd);

execvp("ls", param);
}
else {
wait(NULL);
}
}

我编译并执行它,并在 outfile 中找到了预期的结果。

唯一的区别是我用 S_IRUSER | 打开 feed S_IWUSER 权限选项,否则打开失败。我在你的代码中看到了类似的东西,但你以某种方式评论了它们......

关于file - 在 fork() 之后将标准输出重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517913/

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