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

  1. #1
    Membre du Club
    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
    Points : 40
    Points
    40
    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 du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 56
    Points
    56
    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 du Club
    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
    Points : 40
    Points
    40
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    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);

  5. #5
    Membre du Club
    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
    Points : 40
    Points
    40
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    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).

  7. #7
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Les fscanf fonctionnent, j'affiche les varibales retournées avec des printf et elles sont correctes, la chaine de commande dans le system() est aussi correcte, mais la fonction system ne s'exécute pas.
    Les bibliothèques sont bien incluses.

  8. #8
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Le gros souci c'est de savoir pourquoi je ne peut pas exécuter la fonction system à son deuxième appel avec une commande toute simple.

  9. #9
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    Par défaut
    tu pourrais peut être tester et afficher le code de retour de la fonction system()

    et aussi essayer de mieux indenter/présenter ton code par la même occasion

  10. #10
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Comment je peux faire cela ?

  11. #11
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    Par défaut
    faire quoi ?
    tester le code retour de system() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ret = system(....)
    printf("Code ret de system() = %d\n", ret);
    mieux présenter/indenter ?
    En éditant ton post initial (ou en postant ton nouveau code) et en essayant d'aligner les blocs de code de manière à rendre plus lisible la structure pour faciliter la lecture.

  12. #12
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Tout d'abord la fonction system ne renvoi rien, ensuite voici le code réindenté :

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    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)	//Si logindex3 n'existe pas ou ne contient pas de lignes on le créé
            {
                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");
     
     
            }	//Fin du if
     
    		else 
            {
    					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)	//Si le fichier log n'existe pas ou ne contient plus de ligne on le supprime
                            {
     
                                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)
                                {
     
                                // 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);
     
    								///////// Effacement de la ligne dans le fichier log /////////////
    								fflush(stdin);
    								char line[64];
    								strcpy(line, ligne);
    								char filename[64];
    								strcpy(filename, pathlog);
    								char command2[256];
    								sprintf(command2, "sed -i '/%s/d' %s", line, filename);
    								system(command2);
     
    								int ret;
    								ret = system(command2);
    								printf("Code ret de system() = %d\n", &ret);
    								/////////////////////////////////////////////////////////////////
     
    								log = fopen(pathlog, "r+");
    								printf("\n%s\n", command2);	
     
                                    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);
     
     
                            	}// fin while
     
                           }// fin else
     
            }//fin else
     
     
     
        }// fin boucle principale

  13. #13
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Pardon la fonction system renvoi -915223760

  14. #14
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    Par défaut
    comment cela, elle ne retourne rien ?

    Fait l'effort de copier ce que je te donne
    Ce que je t'avais proposé
    Code mon code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Code ret de system() = %d\n", ret);

    Ce que tu as écrit et ce n'est pas la même chose, cela qui introduit un crash potentiel de ton application
    Code ton code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Code ret de system() = %s\n", &ret);

  15. #15
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Avec ton code j'obtient une erreur de segmentation à l'exécution.

  16. #16
    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 : 61
    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
    Points : 50 369
    Points
    50 369
    Par défaut
    Je pense surtout que mon code révèle un problème qui existait déjà avant dans ton code.

    As tu essayé de debugger pour voir quelle est la ligne de code qui produit le problème ? De cette manière, tu auras aussi les paramètres utilisés à cette ligne de code pour aider à comprendre le problème.

  17. #17
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    La ligne de code qui produit cette erreur c'est le printf de ton code.

  18. #18
    Membre du Club
    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
    Points : 40
    Points
    40
    Par défaut
    Je pense que le problème vient de l'utilisation de la fonction system dans un while, lorsque je la place en début du programme elle fonctionne, dans le while elle ne s'exécute pas.
    Si vous avez des solutions...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par vaderetro33 Voir le message
    Je pense que le problème vient de l'utilisation de la fonction system dans un while,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
    int 
    main (int argc, char *argv[])
    {
        int i =0;
        int ret ;
        while (i<5){
            ret = system("ls ./");
            printf("%d %d\n", ret, i);
            i++;    
        }
        return 0;
    }
    Le problème est ailleurs comme le dit ram-0000

    Uitlises-tu gdb ?
    Si oui tu devrais lancé ton prog avec, et nous retourner ici, après la seg fault le résultat.

  20. #20
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    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);
    Citation Envoyé par ram-0000 Voir le message
    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).
    Non, la syntaxe est correct, il ne faut pas doubler les \ ni rajouter de s. "%[^\n]" permet de lire tout les caractères jusqu'au \n.
    Par contre il n'y a aucune vérification sur la taille lue et donc un potentiel débordement de buffer.

    Il est préférable d'utiliser ici fgets() + recherche/suppression du \n afin de gérer la taille du buffer.

    Citation Envoyé par vaderetro33 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char * pathlog;
    fscanf(logindex,"%[^\n]", pathlog);    //on copie le chemin vers le fichier log à traiter
    pathlog n'est pas un pointeur valide ici.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

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

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