gpt4 book ai didi

c++ - 我可以在启动程序时从命令行重定向额外的文件描述符吗?

转载 作者:太空狗 更新时间:2023-10-29 21:17:34 42 4
gpt4 key购买 nike

在 C++ 中,您可以输出到 coutcerr ,由文件描述符处理 12分别。在 C++ 程序之外,我可以将此输出重定向到任何我想要的地方(在这种情况下,将其写入两个单独的文件):

$ my-program 1>output 2>errors;

我是否只能使用文件描述符 12 ,或者我可以“创建自己的”吗?比方说,我想要第三个输出来保存调试信息,还是第四个输出给管理员发送邮件?

$ my-program 1>output 2>errors 3>>/logs/my-program.log 4>&1 | scripts/email-admin.sh;

我可以在我的程序中写入文件描述符 3 和 4 吗?

最佳答案

在包装脚本中打开所有文件通常不是一个好的设计。当您希望您的程序更智能,并能够关闭一个大日志文件并启动一个新文件时,您将需要程序中的逻辑。

但要回答实际问题:

,您可以让 shell 打开您喜欢的任何编号的文件描述符,用于输入、输出或两者。让父进程在 execve(2) 之前打开它们与在子进程中使用代码打开它们所得到的相同(至少在 POSIX 系统上,stdin/out/err 只是像其他文件描述符一样,并不特殊。)文件描述符可以标记为 close-on-exec 或不。使用 open(2)O_CLOEXEC,或者在打开后使用 fcntl(2) 设置 FD_CLOEXEC

它们也不必引用常规文件。它们中的任何一个都可以是 ttys、管道、 block 或字符设备文件、套接字,甚至是目录。 (没有用于打开目录的 shell 重定向语法,因为您只能对它们使用 readdir(3),而不能使用 read(2)write(2).)

查看此 bash redirection tutorial .作为我自己的一个简单示例:

peter@tesla:~$ yes | sleep 60 4> >(cat) 5</etc/passwd 9>/dev/tcp/localhost/22 42<>/tmp/insecure_temp &
[1] 25644
peter@tesla:~$ ll /proc/$!/fd
total 0
lr-x------ 1 peter peter 64 Sep 9 21:31 0 -> pipe:[46370587]
lrwx------ 1 peter peter 64 Sep 9 21:31 1 -> /dev/pts/19
lrwx------ 1 peter peter 64 Sep 9 21:31 2 -> /dev/pts/19
l-wx------ 1 peter peter 64 Sep 9 21:31 4 -> pipe:[46372222]
lrwx------ 1 peter peter 64 Sep 9 21:31 42 -> /tmp/insecure_temp
lr-x------ 1 peter peter 64 Sep 9 21:31 5 -> /etc/passwd
l-wx------ 1 peter peter 64 Sep 9 21:31 63 -> pipe:[46372222]
lrwx------ 1 peter peter 64 Sep 9 21:31 9 -> socket:[46372228]

# note the rwx permissions: some are read-write, some are one-way

>(cmd) 进程替换语法扩展为文件名,如 /dev/fd/63。使用 4>>(cmd) 也将 fd 打开为 fd 4。

将 stderr 重定向到管道需要 some juggling of file descriptors ,因为没有 2| cmd 语法。 2>>(cmd) 有效,但 cmd 在后台运行:

peter@tesla:~$ (echo foo >&2 ) 2> >(wc)  # next prompt printed before wc output
peter@tesla:~$ 1 1 4

peter@tesla:~$ ( echo foo >&2; ) 2>&1 | wc
1 1 4

关于c++ - 我可以在启动程序时从命令行重定向额外的文件描述符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490970/

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