Fonctions C en rapport avec le système Linux

Fonctions
abort()

execl()
execle()
execlp()
execv()
execvp()

mkfifo()

sigaddset()
sigdelset()
sigemptyset()
sigfillset()
sigismember()
signal()

sleep()

system()

tmpnam()


abort()

Nom
abort - Termine anormalement le programme.
Syntaxe
 
#include <stdlib.h> // contient le prototype de abort()

void abort (void);

Description

    La fonction abort() envoie au processus qui l'appelle le signal SIGABRT dont le traitement par défaut est de terminer le processus de façon anormale :  ni la fermeture des fichiers ouverts, ni la sauvegarde des buffers de sortie, ni la suppressions des fichiers temporaires ne sont garantis : ils dépendent de l'implémentation. Sous Linux, ces opérations semblent être effectuées.

    Si, dans le programme, le signal SIGABRT est dérouté vers un traitant, et si ce traitant se termine "normalement" [1], la fonction abort() reprend le contrôle du processus après la fin du traitant et se termine par l'instruction :
 
exit (EXIT_FAILURE);

    Même si le signal SIGABRT est ignoré ou bloqué, la fonction abort() passe outre.

Valeur retournée

    La fonction abort() ne revient jamais.

Diagnostic d'erreur

    Aucun


execl()

Nom
execl - exécute un programme (voir Comparaison des fonctions de la famille exec..()).
Syntaxe
 
#include <unistd.h>      // permet d'atteindre le prototype de execl()

int execl (const char * path, const char * arg, ...);

Description

    Le symbole ... (appelé ellipse) signifie que la fonction execl() peut admettre un nombre de paramètres variable (>= 2). La sémantique de la fonction execl() exige que les paramètres supplémentaires soient tous de type const char *, le dernier devant être un pointeur nul (NULL par exemple).

    La fonction C execl() appelle la fonction système execve() en lui passant les paramètres suivants :

Valeur retournée

    En cas d'appel réussi, la fonction execl() ne peut renvoyer de valeur au programme en cours puisque son code n'existe plus et a été remplacé par le nouveau code.

Diagnostic d'erreur

    En cas d'erreur, la fonction execl() renvoie la valeur -1 et la variable globale errno est positionnée.


execle()

Nom
execle - exécute un programme (voir Comparaison des fonctions de la famille exec..()).
Syntaxe
 
#include <unistd.h>      // permet d'atteindre le prototype de execle()

int execle (const char * path, const char * arg , ..., char * const envp[]);

Description

    Le symbole ... signifie ici que la fonction execle() peut admettre plusieurs paramètres de type const char * : arg0, arg1, ..., argn, suivis du paramètre envp. Cette écriture est une simple indication car elle syntaxiquement incorrecte en C/C++, le symbole ellipse ... devant apparaître à la place du dernier paramêtre.

    La déclaration réelle dans le fichier <unistd.h> est d'ailleurs à peu près :
 
extern int execle (const char * path, const char * arg, ...);

    La sémantique de la fonction execle(), comme celle de execl() exige que les paramètres argi soient tous de type const char *, le dernier, argn devant être un pointeur nul (NULL par exemple).

    Le paramètre envp est un tableau de pointeurs vers des chaînes de caractères C (NTCTS) constantes, terminé par un pointeur nul, représentant la liste des variables d'environnement du programme à exécuter.

    La fonction C execle() appelle la fonction système execve() en lui passant les paramètres suivants :

Valeur retournée

    En cas d'appel réussi, la fonction execle() ne peut renvoyer de valeur au programme en cours puisque son code n'existe plus et a été remplacé par le nouveau code.

Diagnostic d'erreur

    En cas d'erreur, la fonction execle() renvoie la valeur -1 et la variable globale errno est positionnée.


execlp()

Nom
execlp - exécute un programme (voir Comparaison des fonctions de la famille exec..()).
Syntaxe
 
#include <unistd.h>     // permet d'atteindre le prototype de execlp()

int execlp (const char * file, const char * arg, ...);

Description

    La fonction execlp() est semblable à la fonction execl(). La seule différence réside dans le fait que, si la chaîne de caractêres pointée par file ne contient pas le caractère /, le fichier est cherché dans tous les répertoires indiqués dans la variable d'environnement PATH. C'est le chemin complet qui est passé en paramètre à la fonction système execve().

Valeur retournée

    En cas d'appel réussi, la fonction execlp() ne peut renvoyer de valeur au programme en cours puisque son code n'existe plus et a été remplacé par le nouveau code.

Diagnostic d'erreur

    En cas d'erreur, la fonction execlp() renvoie la valeur -1 et la variable globale errno est positionnée.


execv()

Nom
execv - exécute un programme (voir Comparaison des fonctions de la famille exec..()).
Syntaxe
 
#include <unistd.h>      // permet d'atteindre le prototype de execv()

int execv (const char * path, char * const argv[]);

Description

    La fonction execv() est semblable à la fonction execl(). La seule différence est que les arguments qui suivent le premier sont rangés dans un vecteur de pointeurs de chaînes de caractères dont le dernier doit être un pointeur NULL.

Valeur retournée

    En cas d'appel réussi, la fonction execv() ne peut renvoyer de valeur au programme en cours puisque son code n'existe plus et a été remplacé par le nouveau code.

Diagnostic d'erreur

    En cas d'erreur, la fonction execv() renvoie la valeur -1 et la variable globale errno est positionnée.


execvp()

Nom
execvp - exécute un programme (voir Comparaison des fonctions de la famille exec..()).
Syntaxe
 
#include <unistd.h>     // permet d'atteindre le prototype de execvp()

int execvp (const char * file, char * const argv[]);

Description

    La fonction execvp() est semblable à la fonction execv(). La seule différence réside dans le fait que, si la chaîne de caractêres pointée par file ne contient pas le caractère /, le fichier est cherché dans tous les répertoires indiqués dans la variable d'environnement PATH. C'est le chemin complet qui est passé en paramètre à la fonction système execve().

Valeur retournée

    En cas d'appel réussi, la fonction execvp() ne peut renvoyer de valeur au programme en cours puisque son code n'existe plus et a été remplacé par le nouveau code.

Diagnostic d'erreur

    En cas d'erreur, la fonction execvp() renvoie la valeur -1 et la variable globale errno est positionnée.


mkfifo()

Nom
mkfifo - Crée un pipe nommé (FIFO)
Syntaxe
 
#include <sys/types.h>    // contient la déclaration de mode_t
#include <sys/stat.h>     // contient le prototype de mkfifo()

int mkfifo (const char * pathname, mode_t mode);

Description

    La fonction mkfifo() crée un pipe nommé, de nom et chemin d'accès indiqués par le paramètre pathname. Les droits sont calculés à partir du paramètre mode et de la valeur courante de umask.

    L'appel à la fonction C mkfifo() est équivalent à l'appel de la fonction système mknod() suivant :
 
dev_t dev;                              // pour les FIFOs, le paramètre dev
mknod (pathname, mode | S_IFIFO, dev);  // est ignoré mais doit être présent

Valeur retournée

     La fonction mkfifo() retourne 0 en cas de succès.

Diagnostic d'erreur

    La fonction mkfifo() renvoie -1 en cas d'erreur et positionne la variable globale errno.


sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember()

    Ces fonctions ou macros sont disponibles dans les différents systèmes, qui permettent les manipulations des masques de signaux.
 
sigaddset  (&masque, numsig) ajoute le signal numsig dans le masque de type sigset_t
sigdelset  (&masque, numsig) supprime le signal numsig du masque de type sigset_t
sigemptyset(&masque) dépositionne tous les signaux dans le masque de type sigset_t
sigfillset (&masque) dépositionne tous les signaux dans le masque de type sigset_t
sigismember(&masque, numsig) vrai si le bit du signal numsig est positionné dans le masque de type sigset_t


signal()

Nom
signal  - modifie le traitant d'un signal
Syntaxe
 
#include <signal.h>     // contient le profil de signal()

void (* signal (int signum, void (* handler) (int))) (int);

Description

    La fonction signal() remplace le traitant du signal signum par le nouveau traitant handler, qui est un pointeur vers une fonction ayant un paramètre de type int et ne renvoyant rien : void. Son type est donc void (*) (int).

    Le paramètre handler peut prendre deux valeurs particulières correspondant aux macros définies dans le fichier <signal.h> :

Valeur retournée

    La fonction signal() renvoie un pointeur vers l'ancien traitant du signal signum.

Diagnostic d'erreur

    La fonction signal() renvoie -1 (de type void (*) (int)) en cas d'erreur et positionne la variable globale errno.


sleep()

Nom
sleep  - suspend le processus pendant un délai en secondes
Syntaxe
 
#include <unistd.h>

unsigned int sleep (unsigned int nb_sec);

Description

    La fonction sleep() suspend le processus pendant le nombre de secondes qui lui est passé en paramètre. Cependant, elle est interruptible par n'importe quel signal non ignoré.

Valeur retournée

    La fonction sleep() renvoie :

Diagnostic d'erreur

    La fonction sleep() ne peut pas échouer.


system()

Nom
system  - exécute une commande.
Syntaxe
 
#include <stdlib.h>

int system (const char * command);

Description

    La fonction system() exécute la commande représentée par la chaîne de caractères command. Plus précisément, elle crée un fils (appel de la fonction système fork()) qui lance l'exécution (appel de la fonction système execve()) d'un shell (commande /bin/sh) auquel il passe la commande à exécuter. Elle attend la fin du fils (fonction système waitpid()) en renvoyant le compte rendu de l'opération. Pendant toute l'exécution, les signaux SIGINT et SIGQUIT sont ignorés, SIGCHLD est bloqué (fonction système sigaction()).

Valeur retournée

    La fonction system() renvoie :

Diagnostic d'erreur

    Voir la valeur retournée.


tmpnam()

Nom
tmpnam  - génère le nom d'un fichier temporaire
Syntaxe
 
#include <stdio.h>     // contient le profil de tmpnam()

char * tmpnam (char * name);

Description

    La fonction tmpnam() fournit à l'utilisateur un nom de fichier unique, appelé fichier temporaire. Si le paramètre name est nul, la fonction stocke le nom dans un espace mémoire statique (voir Déclaration locale, lien interne) dont elle renvoie l'adresse. Il est fortement déconseillé d'essayer de modifier directement ce nom. Chaque nouvel appel à la fonction détruit le nom du fichier temporaire précédemment généré. En conséquence, il est nécessaire de le récupérer dans une variable du programme (soit en passant l'adresse de cette variable dans le paramètre name, soit en recopiant la zone statique au moyen de la fonction C standard strcpy(). La variable réceptrice doit avoir une taille minimale de L_tmpnam accessible à partir du fichier inclus C++ <climits>. En réalité, L_tmpnam est défini dans le fichier <bits/stdio_lim.h>, lui-même inclus dans <stdio.h> donc dans <cstdio>, ou dans <bits/xopen_lim.h< lui-même inclus dans <limits.h>, lui-même dans <climits> !!!

    Le fichier résultant est dans le répertoire /tmp.

Valeur retournée

    La fonction tmpnam() renvoie l'adresse de la zone mémoire contenant la chaîne de caractères générée (la zone statique si le pointeur name est nul en entrée, ou la valeur de name).

Diagnostic d'erreur

    Si le nom du fichier n'a pas pu être généré, la fonction tmpnam() renvoie un pointeur nul et positionne la variable globale errno à EEXIST.


[1] Le traitant ne se termine pas "normalement" s'il se termine par une instruction de rupture de séquence, telle qu'un appel à longjmp() ou à exit() par exemple.