gpt4 book ai didi

c - 如何使用系统调用dup?

转载 作者:行者123 更新时间:2023-11-30 14:57:59 26 4
gpt4 key购买 nike

我试图了解系统调用 dup() 的工作原理。我问这个问题是因为我正在用 C 编写 shell,并且需要将 STDOUT 重定向到文件。这是正确的方法吗?

例如,如果我有以下代码:

remember = dup(STDOUT_FILENO);
fileDescriptor = open("file.txt",O_RDONLY);

那么写入标准输出的所有内容现在都将写入打开的文件?

一旦执行以下行:

remember = dup(STDOUT_FILENO);

STDOUT_FILENO 已从文件描述符表中删除,第一个位置为空。当打开一个新文件时,最早的空文件描述符将被指定给这个新打开的文件,因此在本例中为1。

最佳答案

不。您只需复制标准输出的文件描述符即可。

使用到目前为止的代码,您现在可以进行写入以记住,并且输出也将发送到控制台:

char str = "this now goes to console, too!";
write(remember, str, strlen(str));

如果你想重定向控制台输出,你还必须这样做:

dup2(fileDescriptor, STDOUT_FILENO);

这将关闭STDOUT_FILENO(但是您有一个重复的remember来恢复它,如果需要的话)并用fileDescriptor覆盖它 –从现在开始,控制台输出将写入文件...

如果您从未考虑过恢复到控制台的输出,则可以完全省略对 dup 的第一次调用...

编辑(响应您的编辑):

STDOUT_FILENO is removed from the table of file descriptors leaving the first spot empty. When a new file is opened, the earliest empty file descriptor will be appointed to this new opened file, so in this case 1.

这适用于close(STDOUT_FILENO)!

所以回到如果不想恢复:你也可以这样做:

close(STDOUT_FILENO);
fileDescriptor = open("file.txt",O_WRONLY | O_CREAT);
// fileDescriptor will be 1 now

顺便说一句:您必须在启用写入访问权限(O_WRONLY 或 O_RDWR)的情况下打开文件,因为您要写入该文件(将输出重定向到)!

如果文件尚不存在,则需要 O_CREAT 标志。如果您不想清除文件,而是追加到文件中,请添加 O_APPEND 标志(请参阅 open )。

关于c - 如何使用系统调用dup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556061/

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