2017-10-21 26 views
0

terminal code(Unix/Linux) Comment exécuter un programme C à partir d'un autre programme C nécessitant un fichier d'entrée?

Dans l'image ci-dessus, le code peut simplement être exécuté à partir du terminal. Les fichiers pipeclient et pipeserver sont exécutés. Le fichier pipeclient prend le fichier command.txt en entrée en utilisant le symbole <.

Maintenant, si je ne veux pas exécuter le fichier pipeclient depuis le terminal, mais que je veux exécuter un programme C, comment procéder? L'ensemble de fonctions exec va-t-il m'aider? Comment exécuter le fichier pipeclient avec le fichier d'entrée command.txt d'un programme C?

+1

sur linux vous pouvez utiliser popen() – technosaurus

Répondre

2

Le faible -la façon d'exécuter un programme avec une entrée provenant d'un fichier est de:

  • ouvrir le fichier pour la lecture à l'aide open
  • utiliser l'appel à dupliquer le fichier ouvert du système dup2 au-dessus de la poignée pour l'entrée standard (toujours gérer 0)
  • close la vieille poignée (la copie dupliqué sur le dessus de la poignée 0 restera ouvert)
  • utilisez execve ou une autre fonction de la famille exec pour passer au nouveau programme, qui aura maintenant son entrée standard ouverte au fichier.

Ceci est la même manière que le shell lui-même implémente la redirection d'entrée < file.

Voici un exemple qui fonctionne /usr/bin/rev en utilisant l'entrée d'un fichier commands.txt dans le répertoire courant:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

extern char **environ; 

#define ERROR(msg) do { perror(msg); exit(1); } while(0) 

int main() 
{ 
    // open the input file 
    int fd = open("commands.txt", O_RDONLY); 
    if (fd == -1) 
     ERROR("open"); 

    // "dup" the handle to standard input (handle 0) 
    if (dup2(fd, 0) == -1) 
     ERROR("dup2"); 

    // close the old handle 
    close(fd); 

    // exec the program 
    char *args[] = {"rev", NULL}; 
    execve("/usr/bin/rev", args, environ); 

    // the program never gets here, unless the exec fails 
    ERROR("execve"); 
    return -1; 
} 

Vous pouvez également utiliser la commande system qui exécute une commande shell, y compris la redirection, de sorte que le programme:

#include <stdio.h> 
#include <stdlib.h> 

#define ERROR(msg) do { perror(msg); exit(1); } while(0) 

int main() 
{ 
    if (system("/usr/bin/rev <commands.txt")) 
     ERROR("system"); 

    // this *will* return after completion 
    return 0; 
} 

fonctionnera aussi bien. Ici, l'appel system appelle réellement une copie d'un shell ("/ bin/sh") pour traiter la ligne de commande comme s'il s'agissait d'une commande shell.

Cela est plus pratique, mais vous avez moins de contrôle sur le processus d'appel du programme enfant (par exemple, configuration de son environnement, nettoyage de sa liste d'arguments, etc.). Il existe également des problèmes de sécurité potentiels complexes avec l'utilisation de system qui peut poser problème si votre programme s'exécute sous la forme root, bien que cela ne soit pas un problème ici.

0

vous pouvez utiliser la fonction system pour appeler votre 2ème programme pour le 1er c program.like

1st.c

#include <stdio.h> 
#include<ctype.h> 
#include <stdlib.h> 
int main() 
{ 
    printf("I m 1st program"); 
    system("./2nd.out\n"); 
} 

2nd.c

#include <stdio.h> 
#include<ctype.h> 
#include <stdlib.h> 


int main(int argc, char **argv) 
{ 
     printf("Hello there i m 2nd program\n") 

}