• # Commentaires

    Posté par . En réponse au message rattacher sur init. Évalué à 10.

    je commence à étudier le C
    Bon courage :)
    Et voici que je bute sur un problème qui est peut-être lié aux avancés de gcc.
    Ou peut-être à ton code ? Avant de jeter la pierre à tes outils (ok, tu as mis "peut-être"), il est parfois préférable d'y regarder à deux fois.
    mon soucis ici, c'est que executable reprend le pid du lanceur...
    J'ai du mal à comprendre ta phrase. Ici, le "lanceur", c'est le processus qui reçoit le 0 par le fork, ou le processus qui a lancé le programme (i.e. le shell, par exemple) ?
    #include sys/types.h
    #include unistd.h
    Je suppose que les < et > sont partis durant le copié-collé... (en passant, ce n'est pas du C "pur", mais l'extension au langage C fournie par la norme POSIX. Je précise juste pour qu'il n'y ait pas de confusion, vu que tu commences à étudier le C)
    main() {
    Non. main renvoie une valeur de type int. gcc accepte que main ne renvoie rien, mais c'est une extension non portable, à éviter. Par ailleurs, si tu n'utilises pas de paramètres, il est conseillé de mettre un void explicite comme liste de paramètres (le void n'est pas nécessaire pour main, mais permet d'être plus clair). D'où :
    int main(void)
    La suite :
     pid_t pid;
     pid = fork();
     if (!pid) {
    Pour des valeurs entières, je préfère le test plus explicite :
     if (pid == 0) {
    On remarque que tu n'as prévu que 2 cas dans ton code, alors qu'il y en a normalement 3 : l'erreur (-1), le succès et le processus fils qui continue (0) et le succès et le processus père qui continue (fork renvoie alors le PID du fils). Pour savoir ce qui se passe précisément, distinguer les 3 cas serait souhaitable. Si le forka échoué, le programme quitte sans appeler executable. S'il a réussi, le processus père quitte, et c'est seulement le processus fils qui remplacera sa propre image par celle de executable. Donc le processus exécutant executable aura le PID du fils, et non celui du père. Par contre, son PPID sera celui de son père. Et quand le père se termine, le PPID du fils est changé pour être celui d'un processus défini par l'implémentation (dixit SUSv3), usuellement init si je me souviens bien (ou le grand-père ?).
     execl("./executable", NULL, NULL);
    Il serait bon de vérifier si l'appel fonctionne (-1 en cas d'erreur). Pour l'instant, ça a l'air de marcher, mais quand tu voudras changer le nom du programme appelé, ou que tu te placeras dans un autre dossier pour le lancer, ou... alors tu seras content d'avoir un message d'erreur explicite ;)
     } else {
     return;
     }
    Comme tu n'as pas donné de type de retour à main il est cohérent de ne pas retourner de valeur, mais comme main doit renvoyer une valeur entière, il vaut mieux renvoyer 0 (ou EXIT_SUCCESS).