使用prog的PID作为同一个prog的参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用prog的PID作为同一个prog的参数相关的知识,希望对你有一定的参考价值。

我有一个C程序,它等待一个字符串作为参数,我可以像这样使用它:

./myprog "hello"

我想做的是:

  • 无争议地启动程序
  • 获取此编程的PID
  • 使用此PID作为基础来创建字符串
  • 将此字符串作为正在运行的prog的参数传递。

我知道如何获得pid。我可以这样做:

./myprog &
PID=$!

我有另一个编程用这个pid计算我想要的字符串:

./StringFromPid $PID

我不知道的是:如何使用最后一行的结果作为myProg的输入(已经启动,但没有他的字符串arg,知道当它没有arg时启动它只会关闭......)

我试过了:

./StringFromPid $PID | ./myprog

但它有两个问题:

  1. 它启动了另一个myprog实例,它有另一个pid,所以这不是我想要的。
  2. 出于某种原因,它甚至不起作用。我的意思是,./ StringFromPid $ PID的输出不用作./myprog的输入。它只是关闭,就像没有arg一样。

我无法修改myprog,但我可以修改StringFromPid;我甚至可以将StringFromPid的代码放在我的bash脚本中,因为它根本不大。我已经阅读了很多关于bash脚本的tuto但是我还是新手(不是很多练习)

我找到了一个解决方案,但它不是最优的(远非它):

#!/bin/bash
./myprog $(echo $(./StringFromPid $(let "a = $$";let "b = 5"; let "c = a + b"; echo $c)))

+5是因为我发现当我启动这个脚本时,他的PID和myprog PID之间存在+5差异。不知道为什么,但它的确有效。

但是,我仍然愿意接受更好的解决方案。事实上这个工作在我的电脑上(顺便说一句,我在Ubuntu 16.04上),但最后它必须在我没有管理员权限的CTF服务器上工作

答案

最简单的方法是执行C程序。

#!/bin/bash

# pid of current shell
PID1=$$
echo $PID1

# do stuff

(
    # this is a subshell

    # $$ doesn't change but BASHPID does
    PID2=$BASHPID
    echo $PID2

    # the pid of this C program will be $PID2
    exec myCprogram $(./StringFromPid $PID2)

    # exec doesn't return
    echo "can't get here"
)

# do more stuff

如果你在支持它的平台上,可以使用the LD_PRELOAD trick来覆盖getpid()

exec更简单。

以上是关于使用prog的PID作为同一个prog的参数的主要内容,如果未能解决你的问题,请参考以下文章

Subparsers.add_parser TypeError: __init__() 得到了一个意外的关键字参数“prog”

prog1,2,3

机器视觉 dev_map_prog算子

机器视觉 dev_unmap_prog算子

第一章

升压程序选项中的互斥选项集