pourquoi la famille de fonctions exec () n’exécute pas le code après exec ()?

la page de manuel indique que “la famille de fonctions exec () remplace l’image de processus actuelle par une nouvelle image de processus”. mais je ne comprends pas tout à fait la signification de “remplace l’image de processus actuelle par une nouvelle image de processus”. Par exemple, si exec réussit, le perror ne serait pas atteint

execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL); perror("exec failed"); 

Correct. Si l’ exec fonctionne, le perror ne sera pas appelé, simplement parce que l’appel à perror n’existe plus.

Je trouve qu’il est parfois plus facile, lorsque les nouveaux arrivants sont sensibilisés à ces concepts, de penser que le modèle d’exécution UNIX comprend des processus, des programmes et des instances de programmes.

Les programmes sont des fichiers exécutables tels que /bin/ls ou /sbin/fdisk (notez que cela n’inclut pas des scripts bash ou Python car, dans ce cas, l’exécutable réel serait l’interpréteur bash ou python , pas le script) .

Les instances de programme sont des programmes chargés en mémoire et en cours d’exécution. Bien qu’il existe un seul programme tel que /bin/ls , il peut en exister plusieurs à la fois si, par exemple, vous l’exécutez simultanément.

Cette phrase “chargé dans la mémoire” est l’endroit où les processus entrent en scène. Les processus ne sont que des “conteneurs” dans lesquels des instances de programmes peuvent être exécutées.

Ainsi, lorsque vous fork un processus, vous vous retrouvez avec deux processus distincts , mais ils exécutent toujours des instances distinctes du même programme. L’appel fork est souvent appelé un processus à partir duquel un processus appelle deux processus.

De même, exec n’aura pas d’effet sur le processus mais il supprimera l’instance de programme actuelle dans ce processus et démarrera une nouvelle instance du programme demandé.

Cette suppression dans un appel exec réussi est ce qui perror que le code qui le suit ( perror dans ce cas) ne sera pas appelé.

Cela signifie que votre processus actuel devient le nouveau processus au lieu de ce qu’il était. Vous cessez de faire ce que vous faites et commencez à faire, à être vraiment, quelque chose d’autre à la place, pour ne jamais redevenir ce que fut ce processus.

Au lieu de démarrer un tout nouveau processus, toutefois, votre pid et environnement actuels deviennent le nouveau processus. Cela vous permet de configurer les choses de la manière dont le nouveau processus en aura besoin avant de faire l’exécution

Vous avez raison. perror ne sera pas appelé à moins que execl échoue. Les fonctions exec permettent de démarrer de nouveaux processus dans un système d’exploitation compatible POSIX (généralement associé à un appel fork ). Peut-être qu’un exemple aidera. Supposons que votre programme, appelez-le programmeX, soit en cours d’exécution. Il appelle ensuite l’une des fonctions d’exécution comme celle ci-dessus. programX n’existera plus en tant que processus en cours d’exécution. Au lieu de cela, ls sera en cours d’exécution. Il aura exactement le même PID que programX, mais il s’agira plutôt d’un tout nouveau processus autrement.