Un program C incepe cu executia unei functii rezervate (main). Prototipul functiei este
int main (int argc, char **argv);
unde argc este numarul de argumente, iar argv este un vector de pointeri la argumente.
Cand un program este rulat de catre kernel (in cadrul unui proces, prin intermediul unor functii rezervate), o rutina speciala este invocata inainte de functia main. Aceasta rutina ia valori din kernel (vectorul de argumente si variabilele de mediu) si creeaza cadrul necesar pentru ca functia main sa fie invocata.
Un program executabil are urmatoarele zone de memorie componente:
int my_init_var = 100;
aparand in afara oricarei functii, impune ca variabila my_init_var sa fie memorata in segmentul de date;
int my_not_init_var;
aparand in afara oricarei functii, impune ca variabila my_not_init_var sa fie memorata in segmentul de date neinitializate;
Operatiile I/O intensive sunt acelea in care mult timp este petrecut in citirea/scrierea de informatii in fisierele de pe harddisk sau comunicatia cu placa de retea sau alte dispozitive periferice. Operatiile CPU intensive sunt cele care consuma mult timp folosind procesorul. Un server FTP isi petrece majoritatea timpului servind cereri sosite din retea si citind informatii de pe harddisk si deci executa operatii I/O intensive. De partea cealalta, un program care realizeaza prelucrari de semnale (transformate Fourier, de pilda) va executa operatii CPU intensive. Un program mixt este un compilator, care isi petrece o parte din timp scanand fisierele ce contin cod sursa sau cod obiect si alta parte din timp construind diverse structuri de date pentru realizarea de optimizari.
In lumea Linux/Unix un proces este identificat unic de un numar intreg pozitiv. In mod normal acesta are o valoare cuprinsa intre 0 si 65535; limita superioara poate fi modificata daca o situatie necesita acest lucru.
In momentul crearii unui proces, acestuia ii este atribuita o valoare unica din intervalul specificat, prima gasita libera dupa pid-ul ultimului proces creat. Cand se atinge valoarea de 65535, valorile de atribuit se reiau de la 0. Acest identificator unic poarta numele de process ID (pid).
Procesul cu pid-ul 0 se numeste swapper si se ocupa cu planificarea proceselor (scheduling). Acesta nu corespunde unui program de pe disc; este parte a kernel-ului.
Procesul cu pid-ul 1 se numeste init. Pornirea procesului init este ultima etapa a procesului de bootstrap (boot) a sistemului de operare. init este responsabil cu pornirea tuturor celorlalte procese importante si, astfel, a incarcarii complete a sistemului de operare.
O categorie speciala de procese sunt procesele daemon. Un daemon este un proces care ruleaza in background (cu alte cuvinte, nu are un terminal de control si, de obicei, are inchisi descriptorii de intrare, de iesire si de eroare standard). Comunicatia cu utilizatorul se realizeaza prin folosirea de semnale, fisiere de configuratatie sau mecanisme de comunicare interproces prin intermediul unui proces care nu este daemon.
Pentru crearea unui daemon se poate folosi functia daemon. Sintaxa de apel este:
#include <unistd.h> int daemon (int nochdir, int noclose);
Functia intoarce 0 in caz de succes si -1 in caz de eroare. Daca argumentul nochdir este 0 atunci se va schimba directorul curent la directorul radacina (``/''). Acest lucru este necesar pentru a preveni situatia in care directorul curent este un director de pe un sistem de fisiere montat; o incercare de demontare a acestuia va esua. Daca argumentul noclose este 0 atunci intrarea, iesirea si eroarea standard se vor redirecta in ``/dev/null''; se impiedica in acest fel contactul direct cu utilizatorul.