栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何重定向已经运行的进程的输出

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何重定向已经运行的进程的输出

请参阅 从正在运行的进程重定向输出

首先,我

cat > foo1
在一个会话中运行命令,并测试将来自stdin的数据复制到文件中。然后在另一个会话中,我重定向输出。

首先找到该过程的PID:

$ ps aux | grep catrjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

现在检查文件句柄是否已打开:

$ ls -l /proc/6760/fdtotal 3lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5

现在运行GDB:

$ gdb -p 6760 /bin/catGNU gdb 6.4.90-debian[license stuff snipped]Attaching to program: /bin/cat, process 6760[snip other stuff that's not interesting now](gdb) p close(1)$1 = 0(gdb) p creat("/tmp/foo3", 0600)$2 = 1(gdb) qThe program is running. Quit anyway (and detach it)? (y or n) yDetaching from program: /bin/cat, process 6760

p
GDB中的命令将打印一个表达式的值,一个表达式可以是要调用的函数,也可以是系统调用……所以我执行一个
close()
系统调用并传递文件句柄1,然后执行一个
creat()
系统调用以打开一个新的文件。的结果
creat()
为1,表示它替换了先前的文件句柄。如果我想对stdout和stderr使用相同的文件,或者想用其他数字替换文件句柄,则需要调用
dup2()
系统调用以实现该结果。

在此示例中,我选择使用

creat()
而不是,
open()
因为参数较少。用于标志的C宏无法从GDB使用(它不使用C头),因此我必须阅读头文件才能发现这一点–这样做并不难,但会花费更多时间。请注意,0600是具有读/写访问权限的所有者以及该组和其他没有访问权限的所有者的八进制权限。为该参数使用0并稍后在文件上运行chmod也是可行的。

之后,我验证结果:

ls -l /proc/6760/fd/total 3lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5

输入更多数据会

cat
导致文件
/tmp/foo3
被追加。

如果要关闭原始会话,则需要为其关闭所有文件句柄,打开一个可以作为控制tty的新设备,然后调用

setsid()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号