4 ms·
I don't think changing argv[0] in the current process will have any effect in the /proc file system. And to do what you describe, there's `exec -a NAME' alread
by dualbus 8y ago
I don't think changing argv[0] in the current process will have any effect in the /proc file system.
And to do what you describe, there's `exec -a NAME' already:
$ (exec -a NOT-BASH bash -c 'echo $0; ps -p $BASHPID -f')
NOT-BASH
UID PID PPID C STIME TTY TIME CMD
dualbus 18210 2549 0 19:30 pts/1 00:00:00 NOT-BASH -c echo $0; ps -p $BASHPID -f
- LukeShu 8y ago> I don't think changing argv[0] in the current process will have any effect in the /proc file system. Yes it does. This is a standard trick for changing the process name at runtime, several daemons do this to change the process name of child processes created by fork() that aren't separate executable. For instance, OpenSSH's sshd sets the child-process for a session to "sshd: USERNAME [priv]". `exec -a` lets you set argv[0] through an execve() call, but many times you want to set it without exec'ing a new program.
- chrisseaton 8y ago> I don't think changing argv[0] in the current process will have any effect in the /proc file system. Yes it does - that’s the whole point of changing it.
- dualbus 8y agoI would like to understand how this would work. argv is a buffer in Bash's process memory space. This is AFAIK, not shared in any way with the kernel. How would the kernel know that a process wrote to the memory location of argv[0] and then reflect that in /proc? This is what I tried: dualbus@system76-pc:~/src/gnu/bash$ ./bash -c 'echo $BASH_VERSION; ps -p $BASHPID -f; BASH_ARGV0=NOT-BASH; echo $0; ps -p $BASHPID -f; (ps -p $BASHPID -f && : do not optimize fork)' 5.0.0(1)-rc1 UID PID PPID C STIME TTY TIME CMD dualbus 27918 20628 0 20:16 pts/5 00:00:00 ./bash -c echo $BASH_VERSION; ps -p $BASHPID -f; BASH_ARGV0=NOT-BASH; echo $0; ps -p $BASHPID -f; (ps -p $BASHPID -f && : do not optimize fork) NOT-BASH UID PID PPID C STIME TTY TIME CMD dualbus 27918 20628 0 20:16 pts/5 00:00:00 ./bash -c echo $BASH_VERSION; ps -p $BASHPID -f; BASH_ARGV0=NOT-BASH; echo $0; ps -p $BASHPID -f; (ps -p $BASHPID -f && : do not optimize fork) UID PID PPID C STIME TTY TIME CMD dualbus 27921 27918 0 20:16 pts/5 00:00:00 ./bash -c echo $BASH_VERSION; ps -p $BASHPID -f; BASH_ARGV0=NOT-BASH; echo $0; ps -p $BASHPID -f; (ps -p $BASHPID -f && : do not optimize fork)
- chrisseaton 8y agoAny process can write into the argv they get from the kernel. The kernel doesn’t need to monitor for reads - when proc reads it it’s read from the process. It doesn’t need to be specially ‘shared’ with the kernel. The kernel can of course ready any memory it wants to from the process at any time. I’ve implemented setting argv[0] in another language myself.
- dualbus 8y agoCan you show an example of how this would work with BASH_ARGV0?
- chrisseaton 8y agoSorry I don’t know anything about how Bash is implemented, but when someone assigns to that variable Bash just needs to write that string to argv.
- dualbus 8y agoI tried python, bash and even C, none of them update /proc/self/comm when argv[0] is updated: dualbus@system76-pc:~$ cat argv0.c #include <stdio.h> #include <string.h> int main(int argc, char **argv) { FILE *fp; char buf[256]; // XXX :-) strcpy(argv[0], "XYZ"); //puts(argv[0]); fp = fopen("/proc/self/comm", "r"); fread(&buf, 1, 256, fp); buf[255] = '\0'; puts(buf); } dualbus@system76-pc:~$ gcc -o argv0 argv0.c -Wall dualbus@system76-pc:~$ ./argv0 argv0 dualbus@system76-pc:~$ python -c 'import sys; sys.argv[0] = "XYZ"; print(open("/proc/self/comm").read())' python dualbus@system76-pc:~$ ~/src/gnu/bash/bash -c 'BASH_ARGV0="XYZ"; cat /proc/$BASHPID/comm' bash Furthermore, https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.txt#L1749 https://github.com/torvalds/linux/blob/master/Documentation/... says: > 3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm > -------------------------------------------------------- > These files provide a method to access a tasks comm value. It also allows for > a task to set its own or one of its thread siblings comm value. The comm value > is limited in size compared to the cmdline value, so writing anything longer > then the kernel's TASK_COMM_LEN (currently 16 chars) will result in a truncated > comm value. Which works as advertised: dualbus@system76-pc:~$ ~/src/gnu/bash/bash -c 'echo -n XYZ > /proc/$BASHPID/comm; ps -p $BASHPID' PID TTY TIME CMD 28797 pts/6 00:00:00 XYZ Can you show me an example, in any language, where updating argv[0] causes ps (or /proc/self/comm) to show the updated value? EDIT: formatting. EDIT2: I stand corrected, see willglynn's comment.