Linux System Programming: Difference between revisions

From miki
Jump to navigation Jump to search
Line 33: Line 33:
# echo "Especially blackberry."; # Will write starting from new position of seek pointer!
# echo "Especially blackberry."; # Will write starting from new position of seek pointer!
./pie > piefile
./pie > piefile
</source>

== <tt>/proc</tt> filesystem ==
Some links:
* [http://blog.ksplice.com/2011/01/solving-problems-with-proc/ Solving problems with proc]
** ''phantom progress bar'' &mdash; Showing progress of a process in a file, after process was launched

* For a shell, <tt>/dev/fd/###</tt>, <tt>/proc/self/fd/###</tt> and <tt>/proc/$$/fd/###</tt> refer to the same file

* If a program only takes a filename as argument and you want them to process file from standard input, use the fake file <tt>/proc/self/fd/O</tt> ([http://unix.derkeiler.com/Newsgroups/comp.unix.questions/2003-06/0077.html]):
<source lang="bash">
antiword /proc/self/fd/0 < test.doc > test.txt
somecommand | antiword /proc/self/fd/0 > text.txt # Not guarantee to work, because pipe does not support random access
</source>
</source>



Revision as of 10:24, 17 March 2011

Reference

Process

A process contains:

  • A unique process ID number ('pid')
  • A current working directory ('cwd')
  • A user ID and group ID number (actually more than one of each)
  • An open file table
  • An environment' (just a bunch of string data)
  • A signal table
  • An alarm clock
  • Lots of other equipment

Why fork & exec

  • 2 main primitives of kernel to manage processes:
    • fork: create a new process
    • exec: replace a process's object code with the contents of a file
  • Launching a new process is done in 2 steps:
    1. Fork the current process
    2. In the child process, exec the new file that will then replace the code of the current child but keep environment.
  • Why fork and exec with 2 separate commands?
    Because the child process can alter its environment before it does the exec. For example:
    ps > /tmp/procs                # The child shell will first change the output FD, without ps knowing
    

Fork

  • The child will get a new copy of the file descriptor (FD) table.
    So closing a file in the child will not interfere with the parents.
  • However the system open file table is not copied; the same table is shared between child and parent. Why? Because parent must keep the same Seek pointer as the child, even after child is dead:
cat ./pie
# #!/bin/sh
# echo "I like pie.";                      # Will move seek pointer, also in parent
# echo "Especially blackberry.";           # Will write starting from new position of seek pointer!
./pie > piefile

/proc filesystem

Some links:

  • For a shell, /dev/fd/###, /proc/self/fd/### and /proc/$$/fd/### refer to the same file
  • If a program only takes a filename as argument and you want them to process file from standard input, use the fake file /proc/self/fd/O ([1]):
antiword /proc/self/fd/0 < test.doc > test.txt
somecommand | antiword /proc/self/fd/0 > text.txt   # Not guarantee to work, because pipe does not support random access

Examples

Kill on ALARM signal

Small script to kill a process on ALARM signal, implementing a kindof timeout kill (see Perl page).