Procenv and the Process Environment
Quiz
How many attributes of a processes "environment" can you think of besides its environment variables? I'm using the term "environment" in a very loose sense here to mean "any system or process level attribute that can be queried via system calls or library calls (or "/proc-picking") that affects a running process". I'm also including details of the process itself and details of the program that came to be a running process.We're not talking about installed packages or application configuration files in /etc here, but purely low-level program, process and system meta-data.
I've got over 20 items in my list excluding environment variables.
Whilst you're pondering on that...
Compare and Contrast
If you've been involved with computers for any appreciable length of time, chances are you have come across the scenario where some program fails to run in a particular environment, but works "perfectly" in another (generally a developers cosy interactive shell environment).
Ignoring the fact that the development environment should always mirror the production environment as closely as possible, this problem tends to crop up in certain common scenarios. The two most common (from my observations) being:
- system "services"
Such programs (often daemons of course) run -- and indeed should run -- in an exceedingly sparse environment: they get given just enough of an environment to do their job safely and efficiently.
And yes, I get asked quite a lot why some new Upstart job won't start, but runs in a desktop session environment "perfectly" :-) - build systems
Sometimes, the environment of such systems is quite different to what the developer expected. Maybe the build system is a virtualised or chrooted system, or it might be running on a host which has a different architecture to the expected one.
Environment
Back to the poser. How many have you got? Here's my list of "groups":- pid details.
- session details.
- credentials information.
- password database details for user running the program.
- groups user running application belongs to.
- SELinux details.
- CPU details.
- scheduler details.
- capabilities.
- oom details.
- cgroups.
- stat details for the binary that is being run.
- details of libraries that said binary has loaded.
- compiler details for the binary being run.
- uname details.
- open file descriptors.
- process limits.
- system limits.
- configuration-dependent limits.
- timezone details.
- clock details.
- time details.
- terminal details.
- signal dispositions.
- mount details.
- networking details.
- sizeof details.
- ranges of standard system data types.
Procenv
The answer to the two posers above is procenv. This is a simple utility, licensed under the GPL, that essentially dumps every conceivable aspect of a processes environment (*) that it can (without needing super-user privs). It unashamedly emulates a number of existing system utilities as it is attempting to be all-encompassing: I wrote it with the aim of being able to dump "everything" that a process may care about by simply running a single program (by default). Also, the line of demarcation between "process", "program" and "system" is slightly blurry in some aspects (for example sysconf(3) variables could arguably be considered system attributes, but procenv shows these too since they are obviously meant to be querable by applications.(*) - well, it doesn't currently query the network environment and I may have overlooked something, so patches are of course welcome!
Rationale
"But wait!" I hear you cry, "this procenv is redundant: I can get all the information I need from /proc!"Well, that's half correct - you can get a lot of information out of /proc, but there are some caveats with that approach:
- /proc might not be mounted.
- /proc might not be readable (it could legitimately have permissions 0000).
- the format and location of files in /proc may change in the future.
- the format of certain files in /proc is sometimes extremely terse and cryptic.
"Well, I could just write a shell script to massage the data in /proc into a consistent format, or just make use of other system utilities to produce an aggregated report" you say. Yes, you could do that, but procenv is striving to be cross-platform and additional to the /proc concerns, writing such a tool in shell comes with a bag of gotchas if it's going to work on anything but GNU Linux:
- which shell are you going to support?
- which version of standard utilities like (awk (or gawk or even nawk) are you going to support?
Possible Uses
There are quite a few I suspect. Here are a few thoughts on some of the environments it could be run in to give a better understanding of what that enviroment is:- See what nohup(1) does to your process:
$ nohup procenv - See what shell back-grounding using does to your process:
$ procenv & - Exploring the environment available to you when you login to a system with restricted access (what has been restricted?)
- Seeing the environment the kernel gives to the initramfs.
Boot with options including something like:
rdinit=/usr/bin/procenv PROCENV_FILE=/dev/ttyS0 PROCENV_EXEC="/init" - Exploring the environment the initramfs gives to PID 1 aka "init"(aka Upstart for the majority of folks I hope ;-)
init=/usr/bin/procenv PROCENV_FILE=/dev/ttyS0 PROCENV_EXEC="/sbin/init" - Investigating chroots
- Jails (yes, it runs on FreeBSD and Debian GNU/kFreeBSD too :-)
- Explore a container environment (LXC, OpenVZ, VServer, etc).
- Explore an OpenStack or EC2 instance.
- Understanding the environment of an Upstart job:
$ cat << EOT
exec /usr/bin/procenv
EOT | sudo tee /etc/init/procenv.conf
Summary
So, if you want to know if you are a Process Leader or a Session Leader (or both!), or you want to know what your stderr/stdout/stderr are connected to, give procenv a try.
Example Output
Here's some sample output from procenv shown running in an LXC container running Ubuntu Quantal:$ procenv --misc umask: 0002 current directory (cwd): '/home/james' root: '/' chroot: yes selinux context: lxc-container-default (enforce) container: lxc cpu: 4 of 4 scheduler: SCHED_OTHER scheduler priority: process=0, process group=0, user=-11 memory page size: 4096 bytes
Here's an example showing the full details (running procenv with no options):
procenv:
version: procenv 0.3
platform: Linux (Intel)
kernel bits: 32
capabilities(linux):
CAP_CHOWN=yes
CAP_DAC_OVERRIDE=yes
CAP_DAC_READ_SEARCH=yes
CAP_FOWNER=yes
CAP_FSETID=yes
CAP_KILL=yes
CAP_SETGID=yes
CAP_SETUID=yes
CAP_SETPCAP=yes
CAP_LINUX_IMMUTABLE=yes
CAP_NET_BIND_SERVICE=yes
CAP_NET_BROADCAST=yes
CAP_NET_ADMIN=yes
CAP_NET_RAW=yes
CAP_IPC_LOCK=yes
CAP_IPC_OWNER=yes
CAP_SYS_MODULE=no
CAP_SYS_RAWIO=yes
CAP_SYS_CHROOT=yes
CAP_SYS_PTRACE=yes
CAP_SYS_PACCT=yes
CAP_SYS_ADMIN=yes
CAP_SYS_BOOT=yes
CAP_SYS_NICE=yes
CAP_SYS_RESOURCE=yes
CAP_SYS_TIME=yes
CAP_SYS_TTY_CONFIG=yes
CAP_MKNOD=yes
CAP_LEASE=yes
CAP_AUDIT_WRITE=yes
CAP_AUDIT_CONTROL=yes
CAP_SETFCAP=yes
CAP_MAC_OVERRIDE=yes
CAP_MAC_ADMIN=no
CAP_SYSLOG=yes
CAP_WAKE_ALARM=yes
cgroup(linux):
8:perf_event:/lxc/quantal
7:blkio:/lxc/quantal
6:freezer:/lxc/quantal
5:devices:/lxc/quantal
4:memory:/lxc/quantal
3:cpuacct:/lxc/quantal
2:cpu:/lxc/quantal
1:cpuset:/lxc/quantal
clocks:
CLOCK_REALTIME: resolution: 0.000000001s
CLOCK_MONOTONIC: resolution: 0.000000001s
CLOCK_MONOTONIC_RAW: resolution: 0.000000001s
CLOCK_PROCESS_CPUTIME_ID: resolution: 0.000000001s
CLOCK_THREAD_CPUTIME_ID: resolution: 0.000000001s
compiler:
name: GCC
version: 4.7.2
compile date: Oct 27 2012
compile time: 14:57:03
__STRICT_ANSI__: not defined
_POSIX_C_SOURCE: 200809
_POSIX_SOURCE: defined
_XOPEN_SOURCE: 700
_XOPEN_SOURCE_EXTENDED: defined
_ISOC95_SOURCE: defined
_ISOC99_SOURCE: defined
_ISOC11_SOURCE: not defined
_LARGEFILE64_SOURCE: defined
_FILE_OFFSET_BITS: not defined
_BSD_SOURCE: defined
_SVID_SOURCE: defined
_ATFILE_SOURCE: defined
_GNU_SOURCE: defined
_REENTRANT: not defined
_THREAD_SAFE: not defined
_FORTIFY_SOURCE: defined
confstr:
_CS_GNU_LIBC_VERSION: 'glibc 2.15'
_CS_GNU_LIBPTHREAD_VERSION: 'NPTL 2.15'
_CS_PATH: '/bin:/usr/bin'
environment:
TERM=linux
HOME=/home/james
SHELL=/bin/zsh
USER=james
LOGNAME=james
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
MAIL=/var/mail/james
HUSHLOGIN=FALSE
SHLVL=1
PWD=/home/james
OLDPWD=/home/james
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
_=/home/james/./procenv
fds:
fd 0: terminal=yes ('/dev/console')
fd 1: terminal=yes ('/dev/console')
fd 2: terminal=yes ('/dev/console')
fd 3: terminal=yes ('/dev/tty')
fd 4: terminal=no
fd 17: terminal=no
fds (linux/proc):
'/proc/self/fd/0' -> '/dev/console' (terminal=yes, valid=yes)
'/proc/self/fd/1' -> '/dev/console' (terminal=yes, valid=yes)
'/proc/self/fd/2' -> '/dev/console' (terminal=yes, valid=yes)
'/proc/self/fd/3' -> '/dev/tty' (terminal=yes, valid=yes)
'/proc/self/fd/4' -> '/tmp/procenv-lxc.log' (terminal=no, valid=yes)
libs:
/lib/i386-linux-gnu/librt.so.1
/lib/i386-linux-gnu/libselinux.so.1
/lib/i386-linux-gnu/libc.so.6
/lib/i386-linux-gnu/libpthread.so.0
/lib/i386-linux-gnu/libdl.so.2
/lib/ld-linux.so.2
/lib/i386-linux-gnu/libnss_compat.so.2
/lib/i386-linux-gnu/libnsl.so.1
/lib/i386-linux-gnu/libnss_nis.so.2
/lib/i386-linux-gnu/libnss_files.so.2
limits:
RLIMIT_AS (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_CORE (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_CPU (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_DATA (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_FSIZE (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_LOCKS (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_MEMLOCK (soft=65536, hard=65536)
RLIMIT_MSGQUEUE (soft=819200, hard=819200)
RLIMIT_NICE (soft=0, hard=0)
RLIMIT_NOFILE (soft=10240, hard=10240)
RLIMIT_NPROC (soft=63489, hard=63489)
RLIMIT_RSS (soft=4294967295 (max), hard=4294967295 (max))
RLIMIT_RTPRIO (soft=0, hard=0)
RLIMIT_SIGPENDING (soft=63489, hard=63489)
RLIMIT_STACK (soft=8388608, hard=4294967295 (max))
misc:
umask: 0002
current directory (cwd): '/home/james'
root: '/'
chroot: yes
selinux context: lxc-container-default (enforce)
container: lxc
cpu: 4 of 4
scheduler: SCHED_OTHER
scheduler priority: process=0, process group=0, user=-11
memory page size: 4096 bytes
mounts:
fsname='rootfs', dir='/', type='rootfs', opts='rw', dev=(major:8, minor:1)
pathconf for path '/':
_PC_LINK_MAX=65000
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='/dev/disk/by-uuid/7ad192e9-7b26-49d1-8e1c-fefc7dc495cb', dir='/', type='ext4', opts='rw,relatime,errors=remount-ro,data=ordered', dev=(major:8, minor:1)
pathconf for path '/':
_PC_LINK_MAX=65000
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='proc', dir='/proc', type='proc', opts='rw,nosuid,nodev,noexec,relatime', dev=(major:0, minor:36)
pathconf for path '/proc':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='sysfs', dir='/sys', type='sysfs', opts='rw,relatime', dev=(major:0, minor:37)
pathconf for path '/sys':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/console', type='devpts', opts='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000', dev=(major:0, minor:11)
pathconf for path '/dev/console':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/tty1', type='devpts', opts='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000', dev=(major:0, minor:11)
pathconf for path '/dev/tty1':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/tty2', type='devpts', opts='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000', dev=(major:0, minor:11)
pathconf for path '/dev/tty2':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/tty3', type='devpts', opts='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000', dev=(major:0, minor:11)
pathconf for path '/dev/tty3':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/tty4', type='devpts', opts='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000', dev=(major:0, minor:11)
pathconf for path '/dev/tty4':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/pts', type='devpts', opts='rw,relatime,mode=600,ptmxmode=666', dev=(major:0, minor:38)
pathconf for path '/dev/pts':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='devpts', dir='/dev/ptmx', type='devpts', opts='rw,relatime,mode=600,ptmxmode=666', dev=(major:0, minor:38)
pathconf for path '/dev/ptmx':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/proc/sys/fs/binfmt_misc', type='binfmt_misc', opts='rw,nosuid,nodev,noexec,relatime', dev=(major:0, minor:29)
pathconf for path '/proc/sys/fs/binfmt_misc':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/sys/fs/fuse/connections', type='fusectl', opts='rw,relatime', dev=(major:0, minor:16)
pathconf for path '/sys/fs/fuse/connections':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/sys/kernel/debug', type='debugfs', opts='rw,relatime', dev=(major:0, minor:6)
pathconf for path '/sys/kernel/debug':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/sys/kernel/security', type='securityfs', opts='rw,relatime', dev=(major:0, minor:10)
pathconf for path '/sys/kernel/security':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/run', type='tmpfs', opts='rw,nosuid,noexec,relatime,size=814240k,mode=755', dev=(major:0, minor:39)
pathconf for path '/run':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/run/lock', type='tmpfs', opts='rw,nosuid,nodev,noexec,relatime,size=5120k', dev=(major:0, minor:40)
pathconf for path '/run/lock':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/run/shm', type='tmpfs', opts='rw,nosuid,nodev,relatime', dev=(major:0, minor:41)
pathconf for path '/run/shm':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
fsname='none', dir='/run/user', type='tmpfs', opts='rw,nosuid,nodev,noexec,relatime,size=102400k,mode=755', dev=(major:0, minor:42)
pathconf for path '/run/user':
_PC_LINK_MAX=127
_PC_MAX_CANON=255
_PC_MAX_INPUT=255
_PC_NAME_MAX=255
_PC_PATH_MAX=4096
_PC_PIPE_BUF=4096
_PC_CHOWN_RESTRICTED=1
_PC_NO_TRUNC=1
_PC_VDISABLE=0
oom(linux):
oom_score=0
oom_adj=0
oom_score_adj=0
process:
process id (pid): 344
parent process id (ppid): 307
session id (sid): 290 (leader=no)
name: 'procenv'
ancestry: 344 ('procenv'), 307 ('zsh'), 290 ('login'), 1 ('init')
process group id: 344 (leader=yes)
foreground process group: 344
terminal: '/dev/tty'
has controlling terminal: yes
on console: no
real user id (uid): 1000 ('james')
effective user id (euid): 1000 ('james')
saved set-user-id (suid): 1000 ('james')
real group id (gid): 1000 ('james')
effective group id (egid): 1000 ('james')
saved set-group-id (sgid): 1000 ('james')
login name: 'james'
passwd: name='james', gecos='', dir='/home/james', shell='/bin/zsh'
groups: 'james' (1000)
ranges:
char:
unsigned: 0 to 255 (0.000000e+00 to 2.550000e+02, 0x00 to 0xff)
signed: -128 to 127
short int:
unsigned: 0 to 65535 (0.000000e+00 to 6.553500e+04, 0x0000 to 0xffff)
signed: -32768 to 32767
int:
unsigned: 0 to 4294967295 (0.000000e+00 to 4.294967e+09, 0x00000000 to 0xffffffff)
signed: -2147483648 to 2147483647
long int:
unsigned: 0 to 4294967295 (0.000000e+00 to 4.294967e+09, 0x00000000 to 0xffffffff)
signed: -2147483648 to 2147483647
long long int:
unsigned: 0 to 18446744073709551615 (0.000000e+00 to 1.844674e+19, 0x0000000000000000 to 0xffffffffffffffff)
signed: -9223372036854775808 to 9223372036854775807
float:
signed: 1.175494e-38 to 3.402823e+38
double:
signed: 2.225074e-308 to 1.797693e+308
long double:
signed: 3.362103e-4932 to 1.189731e+4932
signals:
SIGHUP ('Hangup', 1): blocked=no, ignored=no
SIGINT ('Interrupt', 2): blocked=no, ignored=no
SIGQUIT ('Quit', 3): blocked=no, ignored=no
SIGILL ('Illegal instruction', 4): blocked=no, ignored=no
SIGTRAP ('Trace/breakpoint trap', 5): blocked=no, ignored=no
SIGABRT ('Aborted', 6): blocked=no, ignored=no
SIGBUS ('Bus error', 7): blocked=no, ignored=no
SIGFPE ('Floating point exception', 8): blocked=no, ignored=no
SIGKILL ('Killed', 9): blocked=no, ignored=no
SIGUSR1 ('User defined signal 1', 10): blocked=no, ignored=no
SIGSEGV ('Segmentation fault', 11): blocked=no, ignored=no
SIGUSR2 ('User defined signal 2', 12): blocked=no, ignored=no
SIGPIPE ('Broken pipe', 13): blocked=no, ignored=no
SIGALRM ('Alarm clock', 14): blocked=no, ignored=no
SIGTERM ('Terminated', 15): blocked=no, ignored=no
SIGSTKFLT ('Stack fault', 16): blocked=no, ignored=no
SIGCHLD|SIGCLD ('Child exited', 17): blocked=no, ignored=no
SIGCONT ('Continued', 18): blocked=no, ignored=no
SIGSTOP ('Stopped (signal)', 19): blocked=no, ignored=no
SIGTSTP ('Stopped', 20): blocked=no, ignored=no
SIGTTIN ('Stopped (tty input)', 21): blocked=no, ignored=no
SIGTTOU ('Stopped (tty output)', 22): blocked=no, ignored=no
SIGURG ('Urgent I/O condition', 23): blocked=no, ignored=no
SIGXCPU ('CPU time limit exceeded', 24): blocked=no, ignored=no
SIGXFSZ ('File size limit exceeded', 25): blocked=no, ignored=no
SIGVTALRM ('Virtual timer expired', 26): blocked=no, ignored=no
SIGPROF ('Profiling timer expired', 27): blocked=no, ignored=no
SIGWINCH ('Window changed', 28): blocked=no, ignored=no
SIGIO ('I/O possible', 29): blocked=no, ignored=no
SIGPWR ('Power failure', 30): blocked=no, ignored=no
SIGSYS ('Bad system call', 31): blocked=no, ignored=no
sizeof:
bits/byte (CHAR_BIT): 8
sizeof (char): 1 byte
sizeof (short int): 2 bytes
sizeof (int): 4 bytes
sizeof (long int): 4 bytes
sizeof (long long int): 8 bytes
sizeof (float): 4 bytes
sizeof (double): 8 bytes
sizeof (long double): 12 bytes
sizeof (size_t): 4 bytes
sizeof (ssize_t): 4 bytes
sizeof (ptrdiff_t): 4 bytes
sizeof (void *): 4 bytes
sizeof (wchar_t): 4 bytes
sizeof (intmax_t): 8 bytes
sizeof (intptr_t): 4 bytes
sizeof (uintptr_t): 4 bytes
sizeof (time_t): 4 bytes
sizeof (clock_t): 4 bytes
sizeof (sig_atomic_t): 4 bytes
sizeof (off_t): 4 bytes
sizeof (fpos_t): 12 bytes
sizeof (mode_t): 4 bytes
sizeof (pid_t): 4 bytes
sizeof (uid_t): 4 bytes
sizeof (gid_t): 4 bytes
sizeof (wint_t): 4 bytes
sizeof (div_t): 8 bytes
sizeof (ldiv_t): 8 bytes
sizeof (lldiv_t): 16 bytes
sizeof (mbstate_t): 8 bytes
stat:
argv[0]: './procenv'
real path: '/home/james/procenv'
dev: major=8, minor=1
inode: 10223742
mode: 0775 (-rwxrwxr-x)
hard links: 1
user id (uid): 1000 ('james')
group id (gid): 1000 ('james')
size: 161516 bytes (320 512-byte blocks)
atime: 1351542553 (Mon Oct 29 20:29:13 2012)
mtime: 1351542549 (Mon Oct 29 20:29:09 2012)
ctime: 1351542549 (Mon Oct 29 20:29:09 2012)
sysconf:
ARG_MAX(_SC_ARG_MAX)=2097152
BC_BASE_MAX(_SC_BC_BASE_MAX)=99
BC_DIM_MAX(_SC_BC_DIM_MAX)=2048
BC_SCALE_MAX(_SC_BC_SCALE_MAX)=99
BC_STRING_MAX(_SC_BC_STRING_MAX)=1000
CHILD_MAX(_SC_CHILD_MAX)=63489
_SC_CLK_TCK=100
COLL_WEIGHTS_MAX(_SC_COLL_WEIGHTS_MAX)=255
EXPR_NEST_MAX(_SC_EXPR_NEST_MAX)=32
HOST_NAME_MAX(_SC_HOST_NAME_MAX)=64
LINE_MAX(_SC_LINE_MAX)=2048
LOGIN_NAME_MAX(_SC_LOGIN_NAME_MAX)=256
OPEN_MAX(_SC_OPEN_MAX)=10240
PAGESIZE(_SC_PAGESIZE)=4096
RE_DUP_MAX(_SC_RE_DUP_MAX)=32767
STREAM_MAX(_SC_STREAM_MAX)=16
SYMLOOP_MAX(_SC_SYMLOOP_MAX)=-1
TTY_NAME_MAX(_SC_TTY_NAME_MAX)=32
TZNAME_MAX(_SC_TZNAME_MAX)=6
_POSIX_VERSION(_SC_VERSION)=200809
BC_BASE_MAX(_SC_BC_BASE_MAX)=99
BC_DIM_MAX(_SC_BC_DIM_MAX)=2048
BC_SCALE_MAX(_SC_BC_SCALE_MAX)=99
BC_STRING_MAX(_SC_BC_STRING_MAX)=1000
COLL_WEIGHTS_MAX(_SC_COLL_WEIGHTS_MAX)=255
EXPR_NEST_MAX(_SC_EXPR_NEST_MAX)=32
LINE_MAX(_SC_LINE_MAX)=2048
RE_DUP_MAX(_SC_RE_DUP_MAX)=32767
POSIX2_VERSION(_SC_2_VERSION)=200809
POSIX2_C_DEV(_SC_2_C_DEV)=200809
POSIX2_FORT_DEV(_SC_2_FORT_DEV)=-1
POSIX2_FORT_RUN(_SC_2_FORT_RUN)=-1
_POSIX2_LOCALEDEF(_SC_2_LOCALEDEF)=200809
POSIX2_SW_DEV(_SC_2_SW_DEV)=200809
_SC_PHYS_PAGES=2035593
_SC_AVPHYS_PAGES=1343166
_SC_NPROCESSORS_CONF=4
_SC_NPROCESSORS_ONLN=4
_POSIX_ADVISORY_INFO(_SC_ADVISORY_INFO)=200809
_POSIX_ASYNCHRONOUS_IO(_SC_ASYNCHRONOUS_IO)=200809
_POSIX_BARRIERS(_SC_BARRIERS)=200809
_POSIX_CHOWN_RESTRICTED=2097152
_POSIX_CLOCK_SELECTION(_SC_CLOCK_SELECTION)=200809
_POSIX_CPUTIME(_SC_CPUTIME)=200809
_POSIX_FILE_LOCKING(_SC_FILE_LOCKING)=-1
_POSIX_FSYNC(_SC_FSYNC)=200809
_POSIX_JOB_CONTROL(_SC_JOB_CONTROL)=1
_POSIX_MAPPED_FILES(_SC_MAPPED_FILES)=200809
_POSIX_MEMLOCK(_SC_MEMLOCK)=200809
_POSIX_MEMLOCK_RANGE(_SC_MEMLOCK_RANGE)=200809
_POSIX_MEMORY_PROTECTION(_SC_MEMORY_PROTECTION)=200809
_POSIX_MESSAGE_PASSING(_SC_MESSAGE_PASSING)=200809
_POSIX_MONOTONIC_CLOCK(_SC_MONOTONIC_CLOCK)=200809
_POSIX_MULTI_PROCESS(_SC_MULTI_PROCESS)=-1
_POSIX_PRIORITIZED_IO(_SC_PRIORITIZED_IO)=200809
_POSIX_PRIORITY_SCHEDULING(_SC_PRIORITY_SCHEDULING)=200809
_POSIX_RAW_SOCKETS=-1
_POSIX_READER_WRITER_LOCKS(_SC_READER_WRITER_LOCKS)=200809
_POSIX_REALTIME_SIGNALS(_SC_REALTIME_SIGNALS)=200809
_POSIX_REGEXP(_SC_REGEXP)=1
_POSIX_SAVED_IDS(_SC_SAVED_IDS)=1
_POSIX_SEMAPHORES(_SC_SEMAPHORES)=200809
_POSIX_SHARED_MEMORY_OBJECTS(_SC_SHARED_MEMORY_OBJECTS)=200809
_POSIX_SHELL(_SC_SHELL)=1
_POSIX_SPAWN(_SC_SPAWN)=200809
_POSIX_SPIN_LOCKS(_SC_SPIN_LOCKS)=200809
_POSIX_SPORADIC_SERVER(_SC_SPORADIC_SERVER)=-1
_POSIX_SYNCHRONIZED_IO(_SC_SYNCHRONIZED_IO)=200809
_POSIX_THREAD_ATTR_STACKSIZE(_SC_THREAD_ATTR_STACKSIZE)=200809
_POSIX_THREAD_CPUTIME(_SC_THREAD_CPUTIME)=200809
_POSIX_THREAD_PRIO_INHERIT(_SC_THREAD_PRIO_INHERIT)=200809
_POSIX_THREAD_PRIO_PROTECT(_SC_THREAD_PRIO_PROTECT)=200809
_POSIX_THREAD_PRIORITY_SCHEDULING(_SC_THREAD_PRIORITY_SCHEDULING)=200809
_POSIX_THREAD_PROCESS_SHARED(_SC_THREAD_PROCESS_SHARED)=200809
_POSIX_THREAD_SAFE_FUNCTIONS(_SC_THREAD_SAFE_FUNCTIONS)=200809
_POSIX_THREAD_SPORADIC_SERVER(_SC_THREAD_SPORADIC_SERVER)=-1
_POSIX_THREADS(_SC_THREADS)=200809
_POSIX_TIMEOUTS(_SC_TIMEOUTS)=200809
_POSIX_TIMERS(_SC_TIMERS)=200809
_POSIX_TRACE(_SC_TRACE)=-1
_POSIX_TRACE_EVENT_FILTER(_SC_TRACE_EVENT_FILTER)=-1
_POSIX_TRACE_INHERIT(_SC_TRACE_INHERIT)=-1
_POSIX_TRACE_LOG(_SC_TRACE_LOG)=-1
_POSIX_VDISABLE=2097152
_XOPEN_CRYPT=63489
_XOPEN_LEGACY=63489
_XOPEN_REALTIME=63489
_XOPEN_REALTIME_THREADS=63489
_XOPEN_UNIX=63489
time:
raw: 1351542560.130094335
local: Mon Oct 29 20:29:20 2012
ISO: 2012-09-29T20:29
timezone:
tzname[0]='UTC'
tzname[1]='UTC'
timezone=0
daylight=0
tty:
c_iflag=0x2502
c_iflag:IGNBRK=0
c_iflag:BRKINT=1
c_iflag:IGNPAR=0
c_iflag:PARMRK=0
c_iflag:INPCK=0
c_iflag:ISTRIP=0
c_iflag:INLCR=0
c_iflag:IGNCR=0
c_iflag:ICRNL=1
c_iflag:IUCLC=0
c_iflag:IXON=1
c_iflag:IXANY=0
c_iflag:IXOFF=0
c_iflag:IMAXBEL=1
c_iflag:IUTF8=0
c_oflag=0x5
c_oflag:OPOST=1
c_oflag:OLCUC=0
c_oflag:ONLCR=1
c_oflag:OCRNL=0
c_oflag:ONOCR=0
c_oflag:ONLRET=0
c_oflag:OFILL=0
c_oflag:OFDEL=0
c_oflag:NLDLY=0
c_oflag:CRDLY=0
c_oflag:TABDLY=0
c_oflag:BSDLY=0
c_oflag:VTDLY=0
c_oflag:FFDLY=0
c_cflag=0x4bf
[c_cflag:input baud speed=B38400]
[c_cflag:output baud speed=B38400]
c_cflag:CBAUDEX=0
c_cflag:CSIZE=1
c_cflag:CSTOPB=0
c_cflag:CREAD=1
c_cflag:PARENB=0
c_cflag:PARODD=0
c_cflag:HUPCL=1
c_cflag:CLOCAL=0
c_cflag:CIBAUD=0
c_cflag:CMSPAR=0
c_cflag:CRTSCTS=0
c_lflag=0x8a3b
c_lflag:ISIG=1
c_lflag:XCASE=0
c_lflag:ICANON=1
c_lflag:ECHO=1
c_lflag:ECHOE=1
c_lflag:ECHOK=1
c_lflag:ECHONL=0
c_lflag:ECHOCTL=1
c_lflag:ECHOPRT=0
c_lflag:ECHOKE=1
c_lflag:FLUSHO=0
c_lflag:NOFLSH=0
c_lflag:TOSTOP=0
c_lflag:PENDIN=0
c_lflag:IEXTEN=1
c_cc:
c_cc[VINTR]:0x3
c_cc[VQUIT]:0x1c
c_cc[VERASE]:0x7f
c_cc[VKILL]:0x15
c_cc[VEOF]:0x4
c_cc[VTIME]:0x0
c_cc[VMIN]:0x1
c_cc[VSWTC]:0x0
c_cc[VSTART]:0x11
c_cc[VSTOP]:0x13
c_cc[VSUSP]:0x1a
c_cc[VEOL]:0x0
c_cc[VREPRINT]:0x12
c_cc[VDISCARD]:0xf
c_cc[VWERASE]:0x17
c_cc[VLNEXT]:0x16
c_cc[VEOL2]:0x0
uname:
sysname: Linux
nodename: quantal
release: 3.5.0-17-generic
version: #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012
machine: i686
domainname: (none)
Code
Grab the code from:
Cool! I've sent you a bunch of merges for more prctl and capabilities reporting.
ReplyDeleteThanks very much for your contributions Kees - merged! Procenv should be in Debian soon.
ReplyDelete