如何在C程序中设置命令行参数,以便当用户键入“ps aux”时能够看到它?

5
当你输入“ps aux”命令时,ps命令会显示程序运行时的命令参数。有些程序会改变这个参数以表明状态。我尝试过更改argv[]字段,但似乎没有效果。是否有一种标准方法设置命令行参数,使它们在用户键入ps时出现?
也就是说,下面的内容不起作用:
int main(int argc,char **argv)
{
    argv[0] = "Hi Mom!";
    sleep(100);
}

09:40 imac3:~$ ./x &
[2] 96087
09:40 imac3:~$ ps uxp 96087 
USER      PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yv32      96087   0.0  0.0  2426560    324 s001  S     9:40AM   0:00.00 ./x
09:40 imac3:~$ cat x.c

我认为这是一种称为“bash tab扩展”的东西。您需要为程序定义一个tab扩展处理程序,并在某个文件中注册它,但是不要问我如何做到这一点。 - fuz
不可能吗?(http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC22)你可能也会喜欢(http://www.netsplit.com/2007/01/10/hiding-arguments-from-ps/) - pmg
1个回答

5

您的想法是正确的,但是在argv[n]中不会更改指针,您必须更改argv[0]本身所指向的字符串:

您的想法是正确的,但是您没有更改argv[n]中的指针,您必须更改argv[0]所指向的字符串本身:

#include <string.h>
#include <unistd.h>

int main(int argc,char **argv)
{
    size_t maxlen = strlen(argv[0]);

    memset(argv[0], 0, maxlen);
    strncat(argv[0], "Hi Mom!", maxlen);
    pause();

    return 0;
}

(请注意,这是否实际更改了由ps显示的命令名称取决于系统。)

@R..: 不是这样的。结合使用 strlen,@caf 发现我们不能保证有比原始的 argv[0] 更多的空间来存储程序名称。此外,memset 并不是必需的,strncat 总是会添加 NULL 结尾。非常干净的代码,很好地利用了 pause() - Matt Joiner
请再看一遍。strncat 被用于将字符串连接到长度为零的字符串上,即作为廉价的 strlcpy 而不是实际的连接。memset 是不必要的,但至少需要 argv[0][0]=0; 来替换它以获得所需的功能。这种不明显性就是我说它很奇怪的原因。 - R.. GitHub STOP HELPING ICE
1
@vy32 并不是真的损坏了,只是被误用、误解,并且它们的合理性早已被遗忘... - rodrigo
@vy32 - 如果您误用非空终止字符数组,才会发生UB。但如果这是您需要的,那么一切都很好。 - rodrigo
@vy32:而且,strncat()总是以空字符结尾。 - caf
@caf,你说得对,strncat()strncpy()在这方面是不同的。这些不一致之处真的很烦人。我会删除我的评论。 - vy32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接