2010-11-26 2 views
1

Je suis en train d'envoyer cette chaîne:envoi de chaîne dans les sockets C?

Code Serveur:

char bash[256] = "grep 'usernama' data/*.txt | awk -F':' '{print $1}' | uniq"; 
char result[1000] = system(bash); 
send(connected, result,strlen(result), 0); 
fflush(stdout); 

Message d'erreur:

error: array must be initialized with a brace-enclosed initializer 

Issit possiible d'envoyer le résultat grep au client de cette façon?

+0

Vous semblez manquer beaucoup de code. –

+0

@ignacio: Peut-il me guider vers les codes? – origame

Répondre

0

La façon la plus simple de faire cela, si vous êtes prêt à appeler system() et d'exécuter un shell, est probablement de rediriger la sortie vers un fichier, puis ouvrez le fichier, lisez son contenu et envoyez-le. Bien sûr, cela ouvre un tas de problèmes (principalement les conditions de course et la gestion des erreurs), mais il est peut-être plus simple que de plonger et d'en apprendre plus sur fork() et exec().

+0

Bon point. Je vais ajouter des fichiers temporaires à ma réponse. –

1

system ne capture pas la sortie de la commande qu'il exécute, il n'est donc pas possible de faire ce que vous voulez.

Si vous regardez le system man page vous pouvez voir qu'il renvoie int, le statut de sortie de la commande que vous exécutez.

Pour capturer la sortie d'un processus, vous devez:

  1. Trouver une bibliothèque qui fait pour vous.
  2. Codez votre propre fork/exec avec l'implémentation de pipes.
  3. redirigez la sortie vers un fichier temporaire, alors lisez que. (De @unwind)

3 serait légèrement plus simple que 2, mais introduirait des problèmes de sécurité et de fiabilité qui ne seraient pas présents dans 1 ou 2.

+0

Donc, il n'y a pas de moyen direct et simple de le faire? – origame

+0

@origame: Pas simple de C. Probablement plus facile de tout faire depuis bash, ou passer à un langage de plus haut niveau tel que python. –

2

système (3) vous renvoie l'état de fork (2), mais pas la sortie standard du programme forké. La solution standard utilise des tuyaux:

char bash_cmd[256] = "grep 'usernama' data/*.txt | awk -F':' '{print $1}' | uniq": 
char buffer[1000]; 
FILE *pipe; 
int len; 

pipe = popen(bash_cmd, "r"); 
if (pipe == NULL) { 
    perror("pipe"); 
    exit(1); 
} 

fgets(buffer, sizeof(buffer), pipe); 
len = strlen(bash_cmd); 
bash_cmd[len-1] = '\0'; 

pclose(pipe);