我有一个在程序中使用argv [0]的C程序。我知道argv [0]是正在执行的程序的路径。我想将自定义字符串作为argv [0]传递给程序而不是程序名称。有没有办法在shell中执行此操作?
我读到了关于exec命令的内容。但我不确定用法。 help exec
说我必须通过exec -a <string>
exec
命令传递特殊字符或其他文件的路径,是否需要使用任何转义方法?澄清问题:
我正在运行程序prog1
。要在程序中输入特定部分,我必须为程序提供SIGALRM
。这个步骤本身很难,因为我不得不创建一个围绕条件的竞赛,以便在程序启动时发送信号。
while true;do ./prog1 2; done & while true; do killall -14 prog1; done
上面的while循环帮助我输入程序的一部分,程序的那部分使用argv[0]
进行系统调用。此系统调用为system(echo something argv[0])
有没有办法修改上面的while循环并放置;/bin/myprogram
而不是argv[0]
。
底线: I need /bin/myprogram
将以prog1
的特权及其输出执行。
答案 0 :(得分:5)
exec -a
正是解决这个问题的方法。
我对作为exec
的参数传递的字符串没有任何限制。正常的shell引用应足以传递您想要的任何内容(当然,只要它不包含嵌入的NUL字节)。
exec
的问题在于用命名命令替换当前shell。如果您只想运行命令,则需要生成要替换的新shell;就像用括号括起命令一样简单:
$ ( exec -a '; /bin/myprogram' bash -c 'echo "$0"'; )
; /bin/myprogram
答案 1 :(得分:0)
蛮力方法是创建自己的符号链接并以这种方式运行命令。
ln -s /path/to/mycommand /tmp/newname
/tmp/newname arg1
rm /tmp/newname
这个问题的主要问题是找到一种安全,无竞争条件的方法来创建符号链接,以保证您运行您想要的命令,这就是bash
添加非标准-a
的原因。 } exec
的扩展名,这样您就不需要基于文件系统的解决方法。
但是,通常情况下,命令会将其行为更改限制为一组固定的可能名称。这意味着可以在首次安装程序时创建任何此类链接,并且不需要即时创建。在这种情况下,不需要exec -a
,因为所有可能的&#34;虚拟&#34;可执行文件已经存在。