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

  FORUM HardWare.fr
  Programmation
  C

  [C/Unix] SIGSEGV > écriture, lecture | siginfo, sigcontext

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C/Unix] SIGSEGV > écriture, lecture | siginfo, sigcontext

n°563350
Evadream -​jbd-
Posté le 10-11-2003 à 18:41:59  profilanswer
 

Hello,
 
Dans le cadre d'un projet, je souhaiterais connaître la nature d'un SIGSEGV que je gère dans un gestionnaire signal. Jusqu'à présent, je pensais faire ca avec la structure sigcontext, mais apparement, c'est déprécié. Qu'elle est la solution au gout du jour ? J'ai été incapble de trouver qqchose de convaincant :|
 
Merci à vous !
 
@+

mood
Publicité
Posté le 10-11-2003 à 18:41:59  profilanswer
 

n°563648
matafan
Posté le 11-11-2003 à 00:42:30  profilanswer
 

siginfo_t :

Code :
  1. int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
  2. struct sigaction
  3.   {
  4.     void (*sa_handler)(int);
  5.     void (*sa_sigaction)(int, siginfo_t *, void *);
  6.     sigset_t sa_mask;
  7.     int sa_flags;
  8.     void (*sa_restorer)(void);
  9.   }
  10. typedef struct siginfo
  11.   {
  12.     int si_signo;               /* Signal number.  */
  13.     int si_errno;               /* If non-zero, an errno value associated with
  14.                                    this signal, as defined in <errno.h>.  */
  15.     int si_code;                /* Signal code.  */
  16.     union
  17.       {
  18.         int _pad[__SI_PAD_SIZE];
  19.          /* kill().  */
  20.         struct
  21.           {
  22.             __pid_t si_pid;     /* Sending process ID.  */
  23.             __uid_t si_uid;     /* Real user ID of sending process.  */
  24.           } _kill;
  25.         /* POSIX.1b timers.  */
  26.         struct
  27.           {
  28.             unsigned int _timer1;
  29.             unsigned int _timer2;
  30.           } _timer;
  31.         /* POSIX.1b signals.  */
  32.         struct
  33.           {
  34.             __pid_t si_pid;     /* Sending process ID.  */
  35.             __uid_t si_uid;     /* Real user ID of sending process.  */
  36.             sigval_t si_sigval; /* Signal value.  */
  37.           } _rt;
  38.         /* SIGCHLD.  */
  39.         struct
  40.           {
  41.             __pid_t si_pid;     /* Which child.  */
  42.             __uid_t si_uid;     /* Real user ID of sending process.  */
  43.             int si_status;      /* Exit value or signal.  */
  44.             __clock_t si_utime;
  45.             __clock_t si_stime;
  46.           } _sigchld;
  47.         /* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
  48.         struct
  49.           {
  50.             void *si_addr;      /* Faulting insn/memory ref.  */
  51.           } _sigfault;
  52.         /* SIGPOLL.  */
  53.         struct
  54.           {
  55.             long int si_band;   /* Band event for SIGPOLL.  */
  56.             int si_fd;
  57.           } _sigpoll;
  58.       } _sifields;
  59.   } siginfo_t;


 
J'oubliais : man sigaction, tout est dedans.


Message édité par matafan le 11-11-2003 à 00:43:36
n°563661
Evadream -​jbd-
Posté le 11-11-2003 à 01:14:27  profilanswer
 

Merci de ton aide, mais j'ai le nez dedans depuis trop longtemps. Ou est-ce qu'on fait la différence entre un sigsev du à une lecture ou à une écriture ?


Message édité par Evadream -jbd- le 11-11-2003 à 01:19:23
n°563663
Evadream -​jbd-
Posté le 11-11-2003 à 01:43:05  profilanswer
 

Je vois ca :

 
+----------------------------------------------------+
|                      SIGSEGV                       |
+------------+---------------------------------------+
|SEGV_MAPERR | address not mapped to object          |
+------------+---------------------------------------+
|SEGV_ACCERR | invalid permissions for mapped object |
+------------+---------------------------------------+


 
Mais ca me dit rien à propos d'une lecture ou d'une écriture.
 


UNDOCUMENTED
       Before  the introduction of SA_SIGINFO it was also possible to get some
       additional information, namely by using a sa_handler with second  argu-
       ment  of  type  struct sigcontext.  See the relevant kernel sources for
       details.  This use is obsolete now.
 


 
Dans le fault.c du mon kernel :
 


/* User mode accesses just cause a SIGSEGV */
         if (error_code & 4) {
                 tsk->thread.cr2 = address;
                 tsk->thread.error_code = error_code;
                 tsk->thread.trap_no = 14;
                 info.si_signo = SIGSEGV;
                 info.si_errno = 0;
                 /* info.si_code has been set above */
                 info.si_addr = (void *)address;
                 force_sig_info(SIGSEGV, &info, tsk);
                 return;
         }


 
Je ne vois pas le moyen employé pour connaître si il s'agit d'une lecture ou d'une écriture.


Message édité par Evadream -jbd- le 11-11-2003 à 02:09:43
n°563672
matafan
Posté le 11-11-2003 à 04:37:59  profilanswer
 

Y'a un truc qui m'échappe : puisque ton programme segfault, tu récupères un coredump. Donc tu lances un debugger avec le core et tu vois où ca coredump exatement. C'est comme ça qu'on fait d'habitude. Pourquoi cherches-tu à intercepter le SIGSEGV ?
 
Edit : en plus, je vois pas comment une lecture pourrait faire segfaulter ton prog. A partir du moment ou c'est dans ton address space, tu peux lire...


Message édité par matafan le 11-11-2003 à 04:40:39
n°563691
Evadream -​jbd-
Posté le 11-11-2003 à 09:42:04  profilanswer
 

C'est un peu particulier. Dans la cadre d'un projet, je développe une mémoire partagée répartie. Initialement, je fais un open de /dev/zero que je mmap par la suite en n'accordant aucun droit afin de symboliser l'état de la mémoire sur le serveur. Lorsque je tente d'accéder à une page de ma mémoire, il y a un sigsegv (je détermine si il s'agit d'un vrai ou d'un faux d'abord ) car je n'ai pas les droits dessus : un gestionnaire de signal prend la main et s'occupe d'aller demander la page au serveur.  
 
Pour connaître les droits que je dois accorder à cette page, il me faut donc connaître si le sigsegv est du à une tentative de lecture ou une tentative d'écriture. Une solution pourrait être d'accorder d'abord le droits en lecture, d'attendre un deuxième sigsegv, et d'accorder les droits en écriture, mais c'est n'est pas optimal.  
 
Voilà toute l'histoire :)


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

  [C/Unix] SIGSEGV > écriture, lecture | siginfo, sigcontext

 

Sujets relatifs
[PHP] Passer une commande système unix en php.[C] lecture d'un fichier et passage en variable de ce qui est lu
équivalent de stdprn sous UNIX ??[C] La bonne écriture d'un hello world ?
[Javascript] Commander la lecture d'une video[PHP] Changer couleur écriture /ligne && Mise à jour date (p.2)
[unix] petit pb ...[DELPHI] lecture ficheir AVIavec mediaplayer
lecture ligne a ligne d'un gros fichier textelecture d'eeprom ( HELP)
Plus de sujets relatifs à : [C/Unix] SIGSEGV > écriture, lecture | siginfo, sigcontext


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