Linux System Programming

From miki
Revision as of 23:16, 13 February 2020 by Mip (talk | contribs) (→‎Input / output (IO))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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 > test.txt   # Not guarantee to work, because pipe does not support random access
antiword <(somecommand) >test.txt                   # Using bash process substitution
  • Read the manpages for more information:
man proc

pthreads

Input / output (IO)

Some traps:

  • Make sure to call write in a loop because write may do partial writes [2].
  • When fsync fails, it will delete the cached pages, meaning that the data will be lost. Note that next fsync would then succeed. See more on fsync here, here, and here.

References:

Very detailed way on how to write to files and dealing with I/O errors.

Memory protection

See C page how we used mprotect to change the protection (read / write / execute) on a memory zone.

Examples

Kill on ALARM signal

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