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

Linux Discussion :

Problème avec write sur fichier


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Problème avec write sur fichier
    Bonjour, voila j'ai un programme qui doit écrire 36 octets 30 fois par sec dans un fichier, mais voila qu'a un certain moment, j'ai un message "Segmentation fault", et l'enregistrement se stop.
    Alors j'ai réduit mon nombre d'écriture par 2, le probleme est toujours présent.

    mon fichier est ouvert avec O_APPEND,O_RDWR,O_TRUNC,O_CREAT.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    Nous sommes voyants,
    Sans code source, il est difficile de trouver l'erreur d'un problème
    Grave urgent !!!

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    En générale les SegFault sont dû à un problème mémoire, on pourrais avoir ton code reduit au minimum et compilable ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    et bien le code oui, compilable c compliqué car j'ai un soft sous RT, une FIFO, et une appli Linux qui écrit sur mon fichier.

    Mon main:

    //lit ma FIFO
    if (FIFO.change())
    reveilleMaThread();

    J'ai une Thread qui Write(monfichier,trame,36) quand elle est reveillé;

    PS: ma tache est reveillé le bon nombre de fois mais mon fichier est tronqué a un moment quand mon erreur intervient.

  5. #5
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    comme le message d'erreur l'indique c'est effectivement un probleme mémoire donc l'algorithme est faux car il sature à un moment ou un autre.
    il faut lui ajouter une allocation pour l'empecher de sortir de la taille aloué quelque soit l'instant de son execution.


    /!\ ceci est le cas général /!\

    à toi de voir pourquoi tu merdes et comment corriger en fonction de ton besoin précis mais je doute que ce soit autre chose.
    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    En faites je tourne sur un PC indus avec 64M de RAm.

  7. #7
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    Ca nous donne pas le source de ton code. :p
    Je pense que tu dois avoir un problème d'algo dans une boucle.
    Grave urgent !!!

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    /***************************************************************************
                              main.c  -  description
                                 -------------------
        begin                : mar oct 12 10:42:14 CEST 2004
        copyright            : (C) 2004 by 
        email                : 
     ***************************************************************************/
     
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   (at your option) any later version.                                   *
     *                                                                         *
     ***************************************************************************/
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <pthread.h>
     
    #define FIFO_READ		"/dev/rtf0"
    #define FIFO_WRITE	"/dev/rtf1"
    #define FICHIER "/tmp/DMX"
     
    #define STORE						1
    #define STOP_STORE			2
    #define RESTORE					3
    #define STOP_RESTORE		4
    #define STANDBY 				5
    #define WAIT_MOVE_DMX		6
     
    #define DEMANDE_ENTETE			0
    #define FORCE_ENTETE				1
    #define DONNEE							2
    #define OPTION							3
    #define LOOP_SHOW						4
     
    int fifo_write,fifo_read,monfichier;
    pthread_t thread1;
    signed char TrameDMXToWrite[60];
    signed char TrameDMXToRead[60];
    signed char TrameEnTeteToWrite[60];
    signed char TrameEnTeteToRead[60];
    char Contenu_Fifo_Read[60];
    char Contenu_Fifo_Write[60];
    unsigned char Etat,lastetat=0,Demande_a_Traiter=0,Nbr_Trame_Sec_Recu,Nbr_Trame_Sec_Fichier;
    unsigned char Cpt,Cpt2;
    unsigned char LastNumTrameTraiter=0;
    unsigned char DureeH,DureeM,DureeS,Jour,Mois,Annee;
    unsigned char TypeTrame;
    unsigned char Test;
    //signed char Loop, AutoGO;
    unsigned char Cpt;
    unsigned long CptTrame=0;
    unsigned long NbrDemande=0;
    pthread_t thread1;
    //unsigned char AStorerQQchose=0;
    void *Thread(void *arg);
    unsigned char DemandeEcriture=0,DemandeLecture=0;
     
    // ***************************************************************************/
     
    void Write_Trame()
    {
    int nlu;
    nlu = write(monfichier,TrameDMXToWrite,36);
    //if (nlu != 36)
    //	printf("erreur ecriture\n");
    //CptTrame++;
    }
     
    // ***************************************************************************/
     
    void Read_Trame()
    {
    int nlu;
    nlu = read(monfichier,TrameDMXToRead,36);
    //if (nlu != 36)
    //	printf("erreur lecture\n");
    //NbrDemande++;
    }
     
    // ***************************************************************************/
     
    void Envoi_FIFO(unsigned char type)
    {
    unsigned char cpt;
    Contenu_Fifo_Write[0] = 0xAA; //trame par sec
    Contenu_Fifo_Write[3] = LastNumTrameTraiter; //num trame traiter
    Contenu_Fifo_Write[1] = DONNEE; //num trame traiter
    Contenu_Fifo_Write[2] = RESTORE; //num trame traiter
    Read_Trame();
     
    //store une trame de 36
    for(cpt=0;cpt<36;cpt++)
    	Contenu_Fifo_Write[cpt+4] = TrameDMXToRead[cpt];
     
    write(fifo_write,Contenu_Fifo_Write,40);
    }
     
    // ***************************************************************************/
     
    int main(int argc, char *argv[])
    {
    fifo_write = open(FIFO_WRITE,O_WRONLY|O_NONBLOCK);
    fifo_read = open(FIFO_READ,O_RDONLY|O_NONBLOCK);
    monfichier = open(FICHIER,O_RDWR|O_NONBLOCK|O_CREAT|O_APPEND);
     
    if (fifo_write != -1)	printf("Fifo write OK\n");
    else									printf("Fifo write bad %d\n",fifo_write);
     
    if (fifo_read != -1)	printf("Fifo read OK\n");
    else									printf("Fifo read bad %d\n",fifo_read);
     
    if (monfichier != -1)	printf("Fichier OK\n");
    else									printf("Fichier bad %d\n",monfichier);
     
    //printf("taille fichier %d\n",lseek(monfichier,0,SEEK_END));
    //pthread_create(&thread1,NULL,Thread,NULL);
     
    while(1)
    	{
    	read(fifo_read,Contenu_Fifo_Read,40);
     
    	Test = Contenu_Fifo_Read[0];	
     
    	if (Test == 0xAA) //test 1er octet
    		{
    		TypeTrame = Contenu_Fifo_Read[1];
     		Etat =  Contenu_Fifo_Read[2];
    		Demande_a_Traiter = Contenu_Fifo_Read[3];
     
    		switch(Etat)
    			{
    			case RESTORE:
    				{
    				//look si demande lecture
    				if (lastetat != Etat)
    					{
    //					printf("Restore\n");
    					lastetat = Etat;
    					LastNumTrameTraiter = 0;
    					lseek(monfichier,0,SEEK_SET); //place le pointeur au debut
    					}
     
    				if (Demande_a_Traiter != LastNumTrameTraiter)
    					{
    					if (TypeTrame == LOOP_SHOW)	
    						{
    						LastNumTrameTraiter = 0;
    						lseek(monfichier,0,SEEK_SET); //place le pointeur au debut
    	//					printf("loop\n");
    						}
    					else
    						{
    						//NbrDemande++;
    						Envoi_FIFO(DONNEE);
    						}
    					LastNumTrameTraiter = Demande_a_Traiter ;
    					}
    				break;
    				}
    			case STORE:
    				{
    				if (lastetat != Etat)//decalage pour laisser place pour entete
    					{
    		//			printf("Store %d\n",Nbr_Trame_Sec_Recu);
    					lastetat = Etat;
    					//vide fichier existant
    					close(monfichier);
    					monfichier = open(FICHIER,O_RDWR|O_NONBLOCK|O_CREAT|O_TRUNC|O_APPEND);
    					}
     
    				//regarde si a traiter
    				if (Demande_a_Traiter != LastNumTrameTraiter)
    					{
    					for(Cpt=0;Cpt<36;Cpt++)
    						TrameDMXToWrite[Cpt] = Contenu_Fifo_Read[Cpt+4];
     
    					//Write_Trame();
    					//DemandeEcriture = 1;
    					pthread_create(&thread1,NULL,Thread,NULL);
    					LastNumTrameTraiter = Demande_a_Traiter ;
    					}
    				break;
    				}	
    			case STOP_STORE:
    				{
    				if (lastetat != Etat)//decalage pour laisser place pour entete
    					{
    		//			printf("Stop Store %d\n",CptTrame);
    					lastetat = Etat;
    					}
    				break;
    				}	
    			case STOP_RESTORE:
    				{
    				break;
    				}	
    			case STANDBY:
    				{
    				if (lastetat != Etat)
    					{
    			//		printf("Standby %d\n",NbrDemande);
    					lastetat = Etat;
    					LastNumTrameTraiter = 0;
    					NbrDemande =0;
    					CptTrame = 0;
    					}
     
    				if (Demande_a_Traiter != LastNumTrameTraiter)
    					{
    					LastNumTrameTraiter = Demande_a_Traiter ;
    					}
    				break;
    				}
    			default:break;
    			}
    		}	
    	}
    close(monfichier);
    return EXIT_SUCCESS;
    }
     
    //****************************************************************************
     
    void *Thread(void *arg)
    {
    struct sched_param p;
    p.sched_priority = 60;
    pthread_setschedparam (pthread_self(),SCHED_FIFO,&p);
     
    //while(1)
    	{
    	//if (DemandeEcriture)
    		{
    		Write_Trame();
    	//	DemandeEcriture = 0;	
    		}
    //	else if (DemandeLecture)
    //		{
    //		ReadTrame();
    //		DemandeEcriture = 0;	
    //		}
    	}
    pthread_exit(NULL);
    }

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Meme si je mets un Write(monfichier,trame,1) ca plante !!!!!!!!!!!
    et si je vire le Write, ca marche...
    si qq'un peut m'aider SVP.

Discussions similaires

  1. [OL-2013] Création d'un message modèle avec lien sur fichier excel
    Par fidecourt dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 07/07/2014, 10h04
  2. Réponses: 28
    Dernier message: 08/10/2012, 09h22
  3. Réponses: 1
    Dernier message: 07/09/2009, 07h15
  4. Hfiltre avec condition sur fichier lié
    Par Boss Nass dans le forum WinDev
    Réponses: 8
    Dernier message: 15/06/2009, 18h47
  5. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 19h42

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