首页 > 系统相关 >由问题“如何将进程A的标准输出重定向为进程B的标准输入"引发的思考

由问题“如何将进程A的标准输出重定向为进程B的标准输入"引发的思考

时间:2023-06-11 20:45:45浏览次数:57  
标签:pidof zwl 重定向 attach 标准 gdb 进程 out

由问题“如何将进程A的标准输出重定向为进程B的标准输入"引发的思考

若两个进程都是通过bash的同一条命令来启动,可以简单得使用bash的管道来完成。但当进程B是已经在运行状态的程序(如服务器程序),该怎么实现这个功能呢?

为简化讨论,进程A取cat/echo等带输出的待启动程序,进程B对应的程序源码(编译为a.out)如下,

//a.c
#include <stdio.h>

int main() {
  int c;
  while((c=getc(stdin)) != '@') {
    printf("%c, %d\n", c, c);
    sleep(1);
  }
  printf("I am over\n");
  return 0;
}

思路1:直接往进程B的proc/pid_of_B/fd/0写数据

echo zwl@@ > /proc/`pidof a.out`/fd/0

实测下来发现,进程B的输出能显式写入的字符序列,但并没有进程B的读操作getc。真实输入终端(键盘)产生字节序列,并将序列写到内存,然后给cpu发送中断信号,触发操作系统的读取处理程序,这里直接写没有后半部分,所以效果不理想。

思路2: 使用正常的文件

进程B将一个正常文件作为输入,进程A往这个文件写入内容。设文件名为aa。
实际测试下来发现两个问题:一是,getc读到文件的末尾会非阻塞式返回EOF,这和stdin中没内容时,read处于阻塞等待状态不同;二是,当B进程移动到aa文件的末尾时,echo zwl@@ > aa,B进程读不到写入的内容,必须以追加的方式向aa添加字节,即echo zwl@@ >> aa

思路3: 使用namedpipe

namedpipe是一种先进先出的文件,相比传统的pipe,namedpipe生存周期同操作系统,即不重启机器都在,而传统的pipe同产生pipe的进程生命周期。

使用下面的脚本bash命令可以向进程B的标准输入传递字节序列"zwl@@"。

touch zwl_pipe
sudo gdb attach `pidof a.out` << EOF
set confirm off
call (void*)dlopen("./libRSIWF.so",2)
call replace_fd_with_norm_file("zwl_pipe", 0)
q
EOF
echo zwl@@ > zwl_pipe

思路4:使用虚拟终端

思路4和思路5除了需要对进程B处理,还需要对进程A处理。思路是将一个管段的两头(两个fd),一个和进程A的stdout相连,另一个和进程
参考https://linux.die.net/man/4/ptmx.

先用gdb attach到进程A(cat),修改其stdout

sudo gdb attach `pidof cat` << EOF
set confirm off
call (void*)dlopen("./libRSIWF.so",2)
call create_pseudo_master_file_and_bind_to_stdout()
q
EOF

ptsname的接口在c程序中用经常会出现问题,最好自己申请字符串内存,然后使用ptsname_r
create_pseudo_master_file_and_bind_to_stdout()打印的输出在原进程B的标准输出,不在gdb所在的进程。

sudo gdb attach `pidof a.out` << EOF
set confirm off
call (void*)dlopen("./libRSIWF.so",2)
call replace_fd_with_norm_file("/dev/pts/5",0)
q
EOF

上面的/dev/pts/5为对cat打桩看到的输出

思路5: 使用socket

在进程B中启动一个socket, acceptY一个来自进程A的socket连接,将进程B中socket和其标准输入绑定,将进程A中的socket和其标准输出绑定。

首先在进程B中使用下面的bash脚本,此时a.out处于等待进程A的socket连接的状态。

sudo gdb attach `pidof a.out`  << EOF
set confirm off
call (void*)dlopen("./libRSIWF.so",2)
call (int)replace_fd_with_a_connected_port(8081,0)
EOF

在另外一个gdb中attach进程A,我们使用下面的脚本和a.out取得连接

sudo gdb attach `pidof cat`  << EOF
set confirm off
call (void*)dlopen("./libRSIWF.so",2)
call (int)replace_fd_with_a_host_and_port("localhost", 8081, 1)
q
EOF

libRSIWF.so的源码见https://gitlab.com/1530306732/notes/-/tree/replace_std_io_with_file?ref_type=heads

标签:pidof,zwl,重定向,attach,标准,gdb,进程,out
From: https://www.cnblogs.com/zwlwf/p/17473545.html

相关文章

  • Fabric不能启动后台进程问题
    在用Fabric启动远程后台进程时,由于自己的后台程序使用类似下面的方式后台运行,导致后台进程不能启动成功 javaMyServer&看了一下官方文档,说是有几种方式可以解决这个问题,下面是我使用的方法首先修改自己的启动后台进程的脚本 nohupjavaMyServer&>/dev/null&然后......
  • trc golang 进程请求追踪包
    trc是一个方便的golang进程请求追踪框架,可以提供方便的请求追踪查看参考使用代码来说官方示例,完整的可以查看官方packagemain import("context""fmt""log""math/rand""net/http""net/http/httptest"_"net/http/pprof""strings""t......
  • mysql 进程初始化killed问题
    问题描述:[root@it01soft]#/mysql/mysql57/bin/mysqld--defaults-file=/etc/my.cnf--user=mysql--initialize-insecure--consoleKilled问题分析:1.查看错误日志,错误日志报错如下:[root@it01soft]#more/mysqldata/mysql_3306/log/mysql-error.log2023-06-09T19:49:59.796928......
  • (进程管理)05.进程的调度算法
    (进程管理)05.进程的调度算法 进程调度,就是绪状态的进程获得CPU的使用权,进程由就绪状态转变成运行状态。进程调度可以分为:抢占式系统会根据进程的优先级高低来进行调度,进程之间可以插队非抢占式系统按照先来先服务的方式来调度,进程间不能插队进程调度算法有很多,......
  • 9.9 接口定义标准
    interfaceIUSB{publicbooleancheck();publicvoidwork();}classComputer{publicvoidplugin(IUSBusb){//电脑上使用USB设备---??什么格式if(usb.check()){usb.work();}else{System.out.println("硬件设......
  • nginx优化配置进程数与cpu亲和性之间的关系,你真正了解吗???
    关于nginx的进程数的配置,以及cpu亲和性的配置,大家能了解多少呢? worker_processes:配置线程数在高并发的web服务器场景下,并发实际是有进程处理,那么为了保障处理并发,线程数肯定要事先启动足。打个比方就像是开餐厅,开业之前需要招聘相对数量的服务员来接待客户。而worker_process......
  • Python使用标准库itertools中count类求解数苹果问题
    问题描述:有一箱苹果,4个4个地数最后余下1个,5个5个地数最后余下2个,9个9个地数最后余下7个。编写程序计算这箱苹果至少有多少个。解题思路:先确定除以9余7的最小整数,对这个数字重复加9,如果得到的数字除以5余2就停止;然后对得到的数字重复加45,如果得到的数字......
  • Python多进程使用队列共享数据协同判断素数
    感谢江西师范大学李雪斌老师提供素材和第一版本代码。问题描述:创建两个队列,qIn用来存储指定范围内的整数,qOut用来存放该范围内的所有素数。创建多个进程,每个进程依次从qIn队列中获取整数,并判断是否为素数,如果是素数则存入qOut。技术要点:1)使用Python标准库multiprocessing创建和管理......
  • 常用Python标准库对象速查表(1)
    封面图片:《Python程序设计基础(第2版)》,董付国,清华大学出版社===============常用Python标准库对象速查表(1)标准库对象简要说明mathsin(x)、cos(x)、tan(x)正弦函数、余弦函数、正切函数,参数单位为弧度asin(x)、acos、atan(x)反正弦函数、反余弦函数、反正切函数ceil(x)、floor(x)向上......
  • 常用Python标准库对象速查表(2):文件与文件夹操作
    封面图片:《Python程序设计基础与应用》,董付国,机械工业出版社图书详情:https://item.jd.com/12433472.html===========os模块常用成员方法功能说明access(path,mode)测试是否可以按照mode指定的权限访问文件chdir(path)把path设为当前工作目录chmod(path,mode,*,dir_fd=None,fol......