[programmation systeme] popen et fgets

popen et fgets [programmation systeme] - C++ - Programmation

Marsh Posté le 30-05-2003 à 15:40:59    

Bonjour;
 
 
j'ai un projet de système et bien sur je me casse la tete avec des segment de mémoire partagé, des fork, des semaphores, du traitement de signaux...
 
et le pire c'est que le plus dur n'est pas le plus compliqué en fait parce que voila mon problème :
lorsque que je lance mon prog (c'est sous unix) je dois avoir un pseudo shell ou je tape les commandes et ça affiche le résultat (apres je dois rebalancer dans des sockets et afficher sur des postes distants).
 
Le pb c'est que les commandes sont bien correctement récupérées et éxécutées mais c'est au niveau de l'affichage des résultats que ca va pas : cela n'affiche que les premiers caractères du résultats (suivant la commande cela varie).
 
Mon tableau a pourtant un taille de 1024 et un ls n'affiche que les 9 premiers caractères.
 
 

Code :
  1. while (1)
  2.     {
  3.       printf("Travail collaboratif#>" );
  4.       fgets(buffer_stdin,sizeof(buffer_stdin),stdin);
  5.       if (strlen(buffer_stdin)-1 != 0)
  6. {
  7. if ((a = popen(buffer_stdin,"r" )) == NULL)
  8.  perror("\nProblème avec le système de saisie des commandes" );
  9. fgets(buffer_stdout,sizeof(buffer_stdout),a);
  10. printf("%s",buffer_stdout);
  11.     buffer_stdout,sizeof(buffer_stdout));
  12. pclose(a);
  13.       }
  14.     }

 
 
merci
d'avance


---------------
L'été il fait bo
Reply

Marsh Posté le 30-05-2003 à 15:40:59   

Reply

Marsh Posté le 30-05-2003 à 18:08:40    

ton code compile meme pas alors meci de reposer un truc potable

Reply

Marsh Posté le 30-05-2003 à 19:08:50    

++Taz a écrit :

ton code compile meme pas alors meci de reposer un truc potable


 
tu es gentil mais si tu veux que je te file les 1500 lignes de code sur le forum il n'y a pas de problème je te file plus de code comme ca tu es content mais cela ne va pas t'avancer à grand chose étant donné que je ne poste pas les fichiers
#include "common.h"
#include "semaphore.h"
#include "sharedMemory.h"
 
Si tu veux vraiment m'aider alors je ne pense pas que compiler mon code soit nécéssaire, reprend juste le principe :
je suis dans le pere que tape des commandes qui sont interprété dans un fils crée par popen et je récupère le résultat grace au pipe fourni par popen.
 
 
 
#include<errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include<unistd.h>
#include <signal.h>
 
#include "common.h"
#include "semaphore.h"
#include "sharedMemory.h"
 
 
 
  int shmid;
  int semid;
 
#include "listenConnection.h"
 
 
 
void arret(int signal)
{
  sem_remove(semid);
  shm_detach(shmid);
  shm_remove(shmid);
  exit(0);
}
 
int main_work(char *argv[])
{
 int pid;
 char buffer_stdin[100];
 char buffer_stdout[SHM_SIZE - 100];
 FILE* a;
 
 switch(pid = fork())
  {
  case -1 :
    perror("\nErreur lors du fork concernant l'initialisation du serveur d'ecoute de connexion\n" );
    exit(EXIT_FAILURE);
  case 0:
    //init_listenConnection(argv);
   while(1)
      {
 sleep(1);
 P(semid);
 ls_write(sock,data->command , sizeof(data->command));
 ls_write(sock,data->result , sizeof(data->result));
 V(semid);
      }
    break;
  default :
    while (1)
    {
      P(semid);
      printf("Travail collaboratif#>" );
      fgets(buffer_stdin,sizeof(buffer_stdin),stdin);
      strcpy(data->command, buffer_stdin);
      if (strlen(buffer_stdin)-1 != 0)
 {
 if ((a = popen(buffer_stdin,"r" )) == NULL)  
  perror("\nProblème avec le système de saisie des commandes" );
 fgets(buffer_stdout,sizeof(buffer_stdout),a);
 printf("%d",strlen(buffer_stdout));
 printf("%s",buffer_stdout);
        strncpy(data->result, buffer_stdout,sizeof(buffer_stdout));
 pclose(a);
      }
      else
 {
   strncpy(data->result,"\0",sizeof(buffer_stdout));
 }
      V(semid);
    }
   
  }
 
}
 
 
int main (int argc, char* argv[])
{
  struct sigaction a;
 
  a.sa_handler = arret;
  sigemptyset(&a.sa_mask);  
  a.sa_flags = 0;
  sigaction(SIGINT,&a,NULL);
 
  shmid = initshm();
  semid = init_sem();
  sem_set_value(semid,1);
 
 
  main_work(argv);
 
  exit(0);
}


---------------
L'été il fait bo
Reply

Marsh Posté le 31-05-2003 à 06:48:51    

et oh, je disais ça parce que quand tu colles "buffer_stdout,sizeof(buffer_stdout));" je ttrouve pas ça terrible comme instruction (au meme titre que ton indentation)
 
ton popen à l'air ok (t'es sur de savoir que fgets stockes aussi le \n final. par contre c'esst les lectures des sockets qui m'inquietent
 
le sizeof
 
s_write(sock,data->command , sizeof(data->command));
ls_write(sock,data->result , sizeof(data->result));
 
je le sens pas tip-top

Reply

Marsh Posté le 31-05-2003 à 12:22:44    

en fait des le debut ca affiche pas ce qu'il faut en fait je ne sais pas si c'est le popen ou le fgets qui marche pas. Je cherche encore.


---------------
L'été il fait bo
Reply

Marsh Posté le 31-05-2003 à 13:48:51    

tu ecoutes ce que je dis? remets pas en cause ses fonctions mais plutot tes communications

Reply

Marsh Posté le 31-05-2003 à 15:29:34    

non mais t'écoute pas non plus ce que je dis car (allé je vire les sockets , je vire les strcpy qui ne servent qu'a copier tout ca dans le segment de mémoire partagé je ne m'interesse qu'au travail du pere)
apres le fgets je fais un printf de ce que j'ai récupéré et la déja ca marche plus donc pas la peine de cherche plus loin ! c'est au niveau du popen ou du fgets qu'il y a un couille !


---------------
L'été il fait bo
Reply

Marsh Posté le 31-05-2003 à 16:13:17    

ou entre la chaise et l'écran. me force pas à te faire un exemple de 3 lignes pour popen pour te montrer que le problème vient pas de la

Reply

Marsh Posté le 03-06-2003 à 11:06:30    

Monsieur je sais tout j'avais bien vu d'ou venait l'erreur mm si je n'arrivais pas à la corriger (enfin si maintenant c'est fait)
 
je t'explique :
c'est fgets qui ne va pas en fait, un read ou un fgetc avec un boucle qui teste si le buffer est plein ou le caractère EOF est rencontré corrige le problème.
 
 
 


---------------
L'été il fait bo
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed