• # dup2 + fcntl

    Posté par . En réponse au message Lancer le programme 'chat' sur un port série. Évalué à 1.

    C'est sûrement dû au CLOSE-ON-EXEC. Je ne pense pas que tu puisses le manipuler directement en utilisant des FILE *, mais avec des file descriptor ça devrait marcher, comme dans ce bout de code :

    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    int main(int ac, char **av)
    {
     int input, output;
     const char * modem = "/dev/ttyMODEM";
     const char * argv[4];
     input = open(modem, O_RDONLY);
     if (input < 0) {
    	fprintf(stderr, "Can't open <%s> for reading: %m\n", modem);
    	return 1;
     }
     output = open(modem, O_WRONLY);
     if (output < 0) {
    	fprintf(stderr, "Can't open <%s> for writing: %m\n", modem);
    	return 1;
     }
     if (fcntl(input, F_SETFD, 0) < 0) {
    	fprintf(stderr, "Failed to clear close-on-exec flag in input: %m\n");
    	return 1;
     }
     if (fcntl(output, F_SETFD, 0) < 0) {
    	fprintf(stderr, "Failed to clear close-on-exec flag in output: %m\n");
    	return 1;
     }
     if (dup2(input, STDIN_FILENO) < 0) {
    	fprintf(stderr, "Cant set input: %m\n");
    	return 1;
     }
     if (dup2(output, STDOUT_FILENO) < 0) {
    	fprintf(stderr, "Cant set output: %m\n");
    	return 1;
     }
     close(input);
     close(output);
     argv[0] = "/usr/sbin/chat";
     argv[1] = "-v";
     argv[2] = "-f";
     argv[3] = NULL;
     if (execv(argv[0], argv) < 0) {
    	fprintf(stderr, "Failed to execv(%s, %s, %s): %m\n", argv[0], argv[1], argv[2]);
    	return 1;
     }
     return 0;
    }