使用prog的PID作为该prog的参数

时间:2019-03-09 13:30:34

标签: bash pid

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

./myprog "hello"

我想做的是:

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

我知道如何获取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脚本的教程,但是我仍然是新手(不是很多练习)

我找到了一个解决方案,但这并不是最佳选择(远非如此):

#!/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服务器上工作

1 个答案:

答案 0 :(得分:2)

最简单的方法是执行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更简单。