Proc file system is a pseuso-filesystem that contains the running state information of Linux kernel. This information is presented in the form of proc files. Every proc file represents some information about the current state of kernel. Now, since proc files represent the dynamic state of kernel so no two system can contain exactly same proc file information. The 'Pseudo' word used here is because these proc files are filled with information on run time, ie, when they are read through a utility like 'cat' etc. One can create his/her own entry of proc file in the proc file system by writing a loadable kernel module(which I have already explained in one of my previous articles).The proc file system is rooted on the '/proc' path.
Example
For a quick view, this is how proc file system looks like on my machine :
Code:
~ $ ls /proc
1 1290 1481 1631 1696 1733 1987 24 32 41 63 836 948 dma kcore mounts swaps zoneinfo
10 1292 15 1634 1697 1736 1988 25 35 414 64 853 977 dri key-users mtrr sys
1051 13 1551 1635 1698 1738 1990 26 353 417 65 874 acpi driver kmsg net sysrq-trigger
1056 1329 1569 1636 17 1760 1992 27 354 42 66 9 asound execdomains kpagecount pagetypeinfo sysvipc
11 14 1603 1638 1702 1784 1993 28 355 5 67 914 buddyinfo fb kpageflags partitions timer_list
12 1429 1606 1641 1704 18 2 29 36 55 68 916 bus filesystems latency_stats sched_debug timer_stats
1255 1448 1607 1642 1705 1820 20 294 37 56 69 927 cgroups fs loadavg schedstat tty
1259 1463 1610 1644 1707 1825 21 295 38 59 7 935 cmdline interrupts locks scsi uptime
1268 1469 1617 1662 1710 1829 2120 296 385 6 718 937 cpuinfo iomem mdstat self version
1269 1471 1619 1665 1713 1885 2135 3 39 60 8 942 crypto ioports meminfo slabinfo version_signature
1273 1475 1624 1672 1714 19 22 30 4 61 824 944 devices irq misc softirqs vmallocinfo
1278 1480 1630 1694 1715 1985 23 31 40 62 829 945 diskstats kallsyms modules stat vmstat
Most of the entries above are directories while some are files also. As we see, most of the names are numerics. These numerics are directories representing the processes currently running in the system and hence their respective names. For each process running in your system there will be a directory entry with name equal to the PID of the process in system. Do you know, even our favorite command 'ps' uses proc files to extract and present the information to us. Anyways, lets enter into a numeric directory (directory corresponding to a process) :
Code:
/ $ cd proc/1273/
/proc/1273 $ ls
attr clear_refs cpuset exe io loginuid mountinfo net oom_score root sessionid stat syscall
auxv cmdline cwd fd latency maps mounts numa_maps pagemap sched smaps statm task
cgroup coredump_filter environ fdinfo limits mem mountstats oom_adj personality schedstat stack status wchan
/proc/1273 $ vim status
Through above command we have enetred the directory corresponding to the process whose PID is '1273'. Now in the next command we have a look at the contents of this directory. We see a wide range of information for a this particular process. Lets open the 'status' file :
Code:
/proc/1273 $ cat status
Name: getty
State: S (sleeping)
Tgid: 1273
Pid: 1273
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups:
VmPeak: 6080 kB
VmSize: 6076 kB
VmLck: 0 kB
VmHWM: 648 kB
VmRSS: 644 kB
VmData: 192 kB
VmStk: 84 kB
VmExe: 20 kB
VmLib: 1648 kB
VmPTE: 36 kB
Threads: 1
SigQ: 1/23963
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed: 3
Cpus_allowed_list: 0-1
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 2
nonvoluntary_ctxt_switches: 2
Stack usage: 8 kB
Now, we see a huge amount of information about the process ranging from the name of the process to the state of the process to its stack usage etc.
So this was all about processes, apart from the processes, a lot of hardware information is also presented by proc files. Like for example in the proc file system, there is a file name 'cpuinfo'. As the name suggests, this file should give a lot of cpu info :
Code:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU T5800 @ 2.00GHz
stepping : 13
cpu MHz : 800.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 3989.88
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU T5800 @ 2.00GHz
stepping : 13
cpu MHz : 800.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 3989.99
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
Similar to this file there are many other files that provide useful information about the dynamic state of kernel and hardware.
One intersting fact about proc files is that their size is always zero.
Code:
/proc $ ls -lart cpuinfo
-r--r--r-- 1 root root 0 2011-09-29 21:39 cpuinfo
This is because, they just reflect the information promised by them. They do not store any information. As soon as you open them, they fetch the information from kernel and provide it to the user-space. As already discussed many of the Linux command line utilities rely on proc files to fetch information. Proc files can be read only or can be read-write. Through read-write proc files, we can even change the dynamic state of the kernel.
In one of next articles, we will learn how to create and modify a proc file.
Conclusion
To conclude, proc file system is a very powerful and simple interface exposed by Linux where-in user processes can have a direct view of the kernel's current state. Besides, viewing the user space can change some of the parameters of the kernel by changing the proc files which are marked as read-write.