Monday, September 7, 2009

全局umask及机制联想

有需要让系统的mask值统一设置成0002.

自己之前对umask的了解:
1. 设置用户的mask值
2. 在设置用户的mask值后, 用户的新进程都使用这个mask

jessinio@niolaptop ~ $ which umask
which: no umask in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/4.3.2:/usr/games/bin:/usr/sbin:/sbin:/usr/local/sbin:/opt)

umask并不是一个独立的一个bin文件, 它是shell中内建的命令

下面两句让我认知都自己的理解是错误的:
1. umask() sets the calling process's file mode creation mask (umask) to mask & 0777 (i.e., only the file permission bits of mask are used), and returns the previous value of the mask.

A  child process created via fork(2) inherits its parent's umask.  The umask is left unchanged by execve(2)
* 来自man 2 umask

总感觉umask的值就像一个环境变量:
jessinio@niolaptop ~ $ umask
0002
jessinio@niolaptop ~ $ bash -c "umask 0022"
jessinio@niolaptop ~ $ umask
0002


子进程是不会影响到父进程的mask值.

这样子, 自己刚开始的需求:
 * 统一影响到所有的程序的Mask值
被分解为三部分:
1. no-interactive的程序, 这里针对/etc/init.d下的daemon
2. interactive的程序
3. 程序自身设置Mask的值

对于第一种, 应该从父进程入手, 系统的所有程序的父进程为init, 查看init的man手册, 没有相关选项.
/sbin/init是由/boot/initrd.img 内的linux脚本启动. 要修改应该从这个入手


对于第二种, 应该从login shell入手. 如:
* /etc/profile
* ~/.profile
* ~/.bash_profile
* ~/.bash_login
* 对于非login shell还有一个文件: ~/.bashrc

对于第三种, 这除了修改代码还有其它办法?

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.