如何将自定义字符串作为argv [0]传递给程序

时间:2016-10-13 18:17:24

标签: bash shell unix

我有一个在程序中使用argv [0]的C程序。我知道argv [0]是正在执行的程序的路径。我想将自定义字符串作为argv [0]传递给程序而不是程序名称。有没有办法在shell中执行此操作?

我读到了关于exec命令的内容。但我不确定用法。 help exec说我必须通过exec -a <string>

  1. 还有其他办法吗?
  2. 如果我使用exec命令传递特殊字符或其他文件的路径,是否需要使用任何转义方法?
  3. 澄清问题:

    我正在运行程序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的特权及其输出执行。

2 个答案:

答案 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;可执行文件已经存在。