我有一个C程序,它等待一个字符串作为参数,我可以像这样使用它:
./myprog "hello"
我想做的是:
我知道如何获得pid。我可以这样做:
./myprog &
PID=$!
我有另一个编程用这个pid计算我想要的字符串:
./StringFromPid $PID
我不知道的是:如何使用最后一行的结果作为myProg的输入(已经启动,但没有他的字符串arg,知道当它没有arg时启动它只会关闭......)
我试过了:
./StringFromPid $PID | ./myprog
但它有两个问题:
我无法修改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
更简单。