Как установить аргументы командной строки в программе C, чтобы они были видны, когда пользователи вводят ps aux?

Когда вы вводите «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

person vy32    schedule 21.09.2010    source источник
comment
Я думаю, что это что-то вроде расширения вкладок bash. Вам нужно определить обработчик расширения табуляции для вашей программы и зарегистрировать его в каком-то файле, но не спрашивайте меня, как это сделать.   -  person fuz    schedule 21.09.2010
comment
Невозможно? ( steve.org.uk/Reference/Unix/faq_2.html#SEC22 ) Вам также может понравиться ( netsplit.com /2007/01/10/скрытие-аргументов-от-ps )   -  person pmg    schedule 21.09.2010


Ответы (1)


У вас была правильная идея, но вы не изменяете указатели в 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, зависит от системы).

person caf    schedule 21.09.2010
comment
@R..: Нет, это не так. В сочетании с strlen, @caf делает очень осторожное замечание, что мы не можем гарантировать, что у нас будет больше места, чем исходное argv[0], для хранения имени нашей программы. Кроме того, memset не требуется, strncat всегда будет заканчиваться нулем. Очень чистый ответ, хорошее использование pause(). - person Matt Joiner; 21.09.2010
comment
Посмотри снова. strncat используется для конкатенации в строку нулевой длины, то есть как дешевый strlcpy вместо фактической конкатенации. memset не нужен, но вам, по крайней мере, понадобится argv[0][0]=0;, чтобы заменить его для желаемой функциональности. Именно из-за этой неочевидности я сказал, что это странно. - person R.. GitHub STOP HELPING ICE; 21.09.2010
comment
@ vy32 Не совсем сломанный, просто неправильно использованный, неправильно понятый, и их обоснование давно забыто ... - person rodrigo; 12.02.2012
comment
@ vy32 - UB происходит только в том случае, если вы неправильно используете массивы символов, не заканчивающиеся нулем. Но если это то, что вам нужно, то все в порядке. - person rodrigo; 12.02.2012
comment
@ vy32: ... и strncat() в любом случае всегда завершает свой результат нулем. - person caf; 12.02.2012
comment
@caf, вы правы, strncat() и strncpy() различаются таким образом. Эти несоответствия очень раздражают. Я удалю свой комментарий. - person vy32; 13.02.2012