tags:

views:

1818

answers:

3

How can I check the umask of a program which is currently running?

[update: another process, not the current process.]

A: 

If you're the current process, you can write a file to /tmp and check its setting. A better solution is to call umask(3) passing zero - the function returns the setting prior to the call - and then reset it back by passing that value back into umask.

The umask for another process doesn't seem to be exposed.

Josh
+3  A: 

From the GNU C Library manual:

Here is an example showing how to read the mask with umask without changing it permanently:

mode_t
read_umask (void)
{
  mode_t mask = umask (0);
  umask (mask);
  return mask;
}

However, it is better to use getumask if you just want to read the mask value, because it is reentrant (at least if you use the GNU operating system).

getumask is glibc-specific, though. So if you value portability, then the non-reentrant solution is the only one there is.

Edit: I've just grepped for ->umask all through the Linux source code. There is nowhere that will get you the umask of a different process. Also, there is no getumask; apparently that's a Hurd-only thing.

Chris Jester-Young
+4  A: 

You can attach gdb to a running process and then call umask in the debugger:

(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
$1 = 18
(gdb) call umask(18)
$2 = 0
(gdb) 

This suggests that there may be a really ugly way to get the umask using ptrace.

Thanks! and bonus gratitude for the reminder to set the umask back!
Mark Harrison