IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction system() avec commandes unix dans boucle


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut Fonction system() avec commandes unix dans boucle
    J'ai un petit souci, la commande system("ma commande unix"); ne fonctionne plus lorsque je l'insère dans une boucle.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    char command[256];
    int a;
     
    for (a =0; a < 5; ++a)
    {
    sprintf(command, "echo %s >> test.txt", a);
    system(command);
    }
    Merci de votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    ton a est un int alors change le %s par %d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(command, "echo %d  >> test.txt", a);

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    Voici mon code, la première utilisation de system("find......"); fonctionne, mais la deuxieme avec system("sed...) ne fonctionne pas, alors que lorsque je tape le code retourné par le printf la commande s'exécute bien et supprime bien la ligne à l'intérieur du fichier log. Je n'arrive a exécuter aucune commande unix dans la boucle où est le second system(), même pas un simple echo.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     while(a==1)
        {
    	    FILE * logindex;
    		char index_name[64];
    		strcpy(index_name,"logindex3.log");
            logindex = fopen("logindex3.log","r+");
            if(file_exists_non_empty("logindex3.log")==0)
            {
                char files_rep[64];
    			strcpy(files_rep, "./logwork/3");
     			char command[256];
    				    sprintf(command, "find %s -type f -name \"*.log\" >>allresults.txt && sort allresults.txt >>sortedresult.txt && rm allresults.txt && head -n 100 sortedresult.txt >>%s && rm sortedindex.txt;", files_rep, index_name);
    					    system(command);
     
     
    			printf("%s", "je rentre dans la premiere boucle");
     
     
            }
    		else //on vérifie que logindex contienne des lignes !
            {
    					printf("%s", "je rentre dans la deuxieme boucle !");
                        char * pathlog;
                        fscanf(logindex,"%[^\n]", pathlog);    //on copie le chemin vers le fichier log à traiter
                        FILE * log;
                        log = fopen(pathlog, "r+");
    					printf("%s", pathlog);
     
                        	/////////// Varibales de récupération des données du fichier log ////////////////
                            char  timestamp[256];
                            char  ip[256];
                            char  port[256];
                            char  eventtype[256];
                            char  id_box[256];
                            char  event[256];
    						///////////////////////////////////////////////////////////////////////////////
    						char chaine[200];
                            if(file_exists_non_empty(pathlog)==0)
                            {
     
                                file_line_delete(pathlog,"logindex3.log"); //Suppression du log de l'index
                                file_delete(pathlog);   // Suppression du fichier log
     
                            }// fin if
     
                            else
                            {
                                while(log !=NULL)
                                {
    							//	fgets(chaine,125, log); 
                                // fgetc(log); // ligne par ligne
     
                                   	char ligne[256];
    		                        fscanf(log,"%[^\n]", &ligne);
    								printf("%s\n", ligne);
                                    fscanf(log,"%[^;];%[^;];%[^;];%[^;];%[^;];%s", &timestamp, &ip, &port, &eventtype, &id_box, &event);
     
    								printf("%s\n %s\n %s\n %s\n %s\n %s\n", timestamp, ip, port, eventtype, id_box, event);
                                	printf("%s", pathlog);
    								fclose(log);
    								char line[64];
    								strcpy(line, ligne);
    								char filename[64];
    								strcpy(filename, pathlog);
    								char command[256];
    								sprintf(command, "sed -i '/%s/d' %s", line, filename);
    								system(command);
    								log = fopen(pathlog, "r+");
    								printf("\n%s\n", command);	
     
                                    char query[500];
                                    sprintf(query, "INSERT INTO mf_boxes_datalogs(dtlog_added_date,bx_ip,evt_type,bx_id,bx_data) VALUES ( '%s','%s', '%s', '%s', '%s')", ip, ip, eventtype, id_box, event);
     
    							   	res = PQexec(conn, query);
     
    								testco = PQresultStatus(res);
     
    								status = PQresStatus(testco);
    								printf("\n%s\n", status);
    //	 							PQfinish(conn); // fermeture de la connection
     
                                    ///////// Effacement de la ligne dans le fichier log /////////////
    								//char delete[256];
        	                       // sprintf(delete, "sed '/%s/d' %s ;", ligne, pathlog);
     
                            	    }// fin while
     
                            }// fin else
     
            }//fin else if
     
     
     
        }// fin boucle principale
    Merci de votre aide.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En doublan,t les caractères \ ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fscanf(logindex,"%[^\\n]", pathlog);
    ...
    fscanf(log,"%[^\\n]", &ligne);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    En doublant les caractère j'obtient une erreur de segmentation, le programme fonctionne comme cela, lorsque je fait un printf de la chaine command (exécutée dans le system()) elle est correcte car en la collant dans le shell elle s'exécute. Le problème c'est que le deuxième system() n'exécute rien, même pas un echo salut !

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Arf !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(log,"%[^\\n]", &ligne);
    Je pense que le caractère & est superflu, ligne est déjà une adresse

    Autre chose, tu es sûr de ton format (%[^\n]). Il manque pas un truc genre "%[^\n]s". (Sur ce coup, je ne suis pas sûr de moi, je ne sais pas).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/03/2011, 13h47
  2. Réponses: 3
    Dernier message: 19/06/2007, 11h27
  3. commandes unix dans un programme C
    Par thepinguin dans le forum C
    Réponses: 9
    Dernier message: 19/10/2006, 02h11
  4. Réponses: 22
    Dernier message: 09/12/2005, 21h27
  5. Réponses: 1
    Dernier message: 20/08/2004, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo