Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2628 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [programmation systeme] popen et fgets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[programmation systeme] popen et fgets

n°411536
fabriceMer​c
Posté le 30-05-2003 à 15:40:59  profilanswer
 

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
mood
Publicité
Posté le 30-05-2003 à 15:40:59  profilanswer
 

n°411651
Taz
bisounours-codeur
Posté le 30-05-2003 à 18:08:40  profilanswer
 

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

n°411682
fabriceMer​c
Posté le 30-05-2003 à 19:08:50  profilanswer
 

++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
n°411808
Taz
bisounours-codeur
Posté le 31-05-2003 à 06:48:51  profilanswer
 

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

n°411860
fabriceMer​c
Posté le 31-05-2003 à 12:22:44  profilanswer
 

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
n°411887
Taz
bisounours-codeur
Posté le 31-05-2003 à 13:48:51  profilanswer
 

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

n°411925
fabriceMer​c
Posté le 31-05-2003 à 15:29:34  profilanswer
 

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
n°411942
Taz
bisounours-codeur
Posté le 31-05-2003 à 16:13:17  profilanswer
 

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

n°414090
fabriceMer​c
Posté le 03-06-2003 à 11:06:30  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [programmation systeme] popen et fgets

 

Sujets relatifs
[blabla@hosto] Le topic des vieuxProgrammation du jeu memory en C
Programmation d'une appli Web : besoin de conseils[PHP] Convention de programmation
[C] - compilation conditionelle (selon système win ou unix)Les bots : programmation, pièges, principes, etc....
[ Cherche langage de programmation ] + question PHP --> EXE ?Systeme de cache
programmation debutant[C] Probleme fgets (resolu)
Plus de sujets relatifs à : [programmation systeme] popen et fgets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR