linux / c> lien> Obtenir le résultat de l'exécution de la commande shell dans le programme C> On m'a appris à utiliser popen ()

Environnement d'exploitation


CentOS 6.5

Je me demandais si je pouvais obtenir le résultat dans un programme C en exécutant une chaîne de commande shell (par exemple who) avec execl () etc.

référence http://stackoverflow.com/questions/1776632/how-to-catch-the-ouput-from-a-execl-command

J'ai essayé. Le code lié ci-dessus n'a qu'une seule ligne, mais en dessous, il essaie d'obtenir plusieurs lignes.

get_execl.c


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

int cmd_quem(void) {
  int result;
  int pipefd[2];
  FILE *cmd_output;
  char buf[1024];
  int status;

  result = pipe(pipefd);
  if (result < 0) {
    perror("pipe");
    exit(-1);
  }

  result = fork();
  if(result < 0) {
    exit(-1);
  }

  if (result == 0) {
    dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
    close(pipefd[0]);
    close(pipefd[1]);

    execl("/usr/bin/who", "who", NULL);
    _exit(1);
  }

  /* Parent process */
  close(pipefd[1]); /* Close writing end of pipe */

  cmd_output = fdopen(pipefd[0], "r");

  while(1) {
    if (feof(cmd_output)) {
      break;
    }
    if (fgets(buf, sizeof buf, cmd_output)) {
      printf("Data from who command: %s", buf);
    } else {
//      printf("No data received.\n");
    }
  }

  wait(&status);
//  printf("Child exit status = %d\n", status);

  return 0;
}

int main()
{
  cmd_quem(); 
}

résultat


% ./a.out        
Data from who command: wrf      tty1         2016-10-21 01:26 (:0)
Data from who command: wrf      pts/0        2016-10-21 01:29 (:0.0)
Data from who command: wrf      pts/1        2016-10-21 01:32 (:0.0)

qui est le résultat


% who
wrf      tty1         2016-10-21 01:26 (:0)
wrf      pts/0        2016-10-21 01:29 (:0.0)
wrf      pts/1        2016-10-21 01:32 (:0.0)

L'inconvénient est que le code est très long.

Version améliorée utilisant popen ()

(Ajout 2016/10/21)

@ hurou927 m'a appris à utiliser popen ().

C'est beaucoup plus simple et plus facile à voir.

Recommended Posts

linux / c> lien> Obtenir le résultat de l'exécution de la commande shell dans le programme C> On m'a appris à utiliser popen ()
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
[sh] Comment stocker les résultats de l'exécution de la commande dans des variables
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
[Linux] Comment utiliser la commande echo
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Je souhaite laisser une commande arbitraire dans l'historique des commandes de Shell
Comment utiliser la bibliothèque C en Python
Obtenez le résultat du GeoCoding inversé en japonais à l'aide du SDK Java de GoogleMapsAPI.
Je veux grep le résultat de l'exécution de strace
Ajouter un utilisateur Linux, comment utiliser la commande useradd
(Rappelez-vous rapidement) Comment utiliser la ligne de commande LINUX
Je souhaite également utiliser les commandes Linux à l'invite de commande! Utilisez les commandes Linux à l'invite de commande au lieu de Git Bash
[Linux] [C / C ++] Résumé de la façon d'obtenir pid, ppid, tid
[Shell] Comment obtenir la branche distante par défaut avec Git
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
Comment surveiller l'état d'exécution de sqlldr avec la commande pv
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Python> Compréhension> Cellules> On m'a appris à utiliser la notation à double inclusion / itertools
Un mémo d'un programme qui récupère une date à deux chiffres avec javascript, Ruby, Python ou un script shell.
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
[Langage C] Comment utiliser la fonction crypt sous Linux [Hachage de mot de passe]
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Comment utiliser Google Test en langage C
Comment calculer Utiliser% de la commande df
Python> set> Convertir avec set ()> dictionary n'est que la clé> On m'a appris à convertir les valeurs du dictionnaire en set / dir ({}) / help ({}) / help ({} .valeurs)
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
python Je ne sais pas comment obtenir le nom de l'imprimante que j'utilise habituellement.
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
Je souhaite stocker les résultats de% time, %% time, etc. dans un objet (variable)
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment obtenir de l'aide dans un shell interactif
Résumé de l'utilisation de MNIST avec Python
Comment utiliser l'API du guide des programmes NHK
Comment obtenir les fichiers dans le dossier [Python]
Connectez-vous avec json en utilisant pygogo.
[Pour les débutants] Comment utiliser la commande say avec python!
Comment obtenir le nom de la variable lui-même en python
J'ai essayé de résumer comment utiliser matplotlib de python
Comment utiliser le contrôleur audio C216 sur Arch Linux
[Langage C] [Linux] Récupère la valeur de la variable d'environnement
Comment utiliser la commande grep et des exemples fréquents
Comment utiliser la clause exist dans l'ensemble de requêtes Django
J'ai essayé de résumer comment utiliser les pandas de python
Comment utiliser le modèle appris dans Lobe en Python
Je veux utiliser le jeu de données R avec python
Je ne peux pas utiliser la commande darknet dans Google Colaboratory!
python> lien> Commentaire de mi-ligne en Python?> On m'a dit qu'il était préférable d'utiliser des arguments nommés.
J'ai essayé de réécrire le serveur WEB de la 1ère édition de programmation Linux normale avec C ++ 14
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
La ventilation est importante. Ce que j'ai fait pour garder une trace de la concentration de C02 dans la pièce
[OCI] Script Python pour obtenir l'adresse IP d'une instance de calcul dans Cloud Shell