La fonction "semctl" avec "GETALL" ( Semaphores) sous Linux

Fermé
assia_nor Messages postés 8 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 31 décembre 2017 - Modifié le 29 déc. 2017 à 12:43
assia_nor Messages postés 8 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 31 décembre 2017 - 31 déc. 2017 à 10:42
bonjour tous le monde :)

je suis une étudiante en Informatique , je face un problème dans la fonction "semctl" avec la commande "GETALL"
l'enoncé de l'exercice :



mon essay :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>

union semun {
 int val;
 struct semid_ds *buf;
 unsigned short *array;
 struct seminfo *__buf;
};

union semun S;
unsigned short t[100] ;

int main( int argc , char* argv[] )
{
  if ( argc < 2 )
    printf("Erreur : entrez l' id du semaphore \n" );
  else{
    int id = atoi( argv[1] );
    char tm[80] ;
    int nsems ;
  S.array = t ;
  semctl ( id , 0 , GETALL , S );
    printf("Semaphore Array \n");
    printf("ID ==> %d\n", id );
    printf("uid =%d \tgid = %d \tcuid = %d \tcgid = %d \n",((S.buf)->sem_perm).uid , ((S.buf)->sem_perm).gid , ((S.buf)->sem_perm).cuid , ((S.buf)->sem_perm).cgid );
    printf("mode = %i\tacces_perms = %i \n", ((S.buf)->sem_perm).mode , ((S.buf)->sem_perm).__seq );
    printf("nsems = %d \n", (S.buf)->sem_nsems );
    time ( &(S.buf)->sem_otime );
    strftime ( tm , 80 , "%c" , localtime(&(S.buf)->sem_otime) );
    printf("otime = %s \n", tm );
    time ( &(S.buf)->sem_ctime );
    strftime ( tm , 80 , "%c" , localtime(&(S.buf)->sem_ctime) );
    printf("ctime = %s \n", tm );
    printf("semnum = %d \n", 0 );
    printf("\t value = %s \n", semctl ( id , 0 , GETVAL ) );
    printf("\t ncount = %s \n", semctl ( id , 0 , GETNCNT ) );
    printf("\t zcount = %s \n", semctl ( id , 0 , GETZCNT ) );
    printf("\t pid = %s \n", semctl ( id , 0 , GETPID ) );
  }
}


le resultat que j'obtient :


le resultat correcte:


je veut savoir où est le problème :(


merci d'avance
A voir également:

2 réponses

123guitare Messages postés 33 Date d'inscription mardi 24 mai 2016 Statut Membre Dernière intervention 30 décembre 2017 1
30 déc. 2017 à 10:03
Bonjour,
Pour le segmentation fault, il me semble que ça vient des printf ligne 45 à 48. La fonction semctl renvoit un int et dans les printf's les format spécifié est %s!
0
assia_nor Messages postés 8 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 31 décembre 2017
31 déc. 2017 à 10:40
Merci pour cette remarque
0
assia_nor Messages postés 8 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 31 décembre 2017
31 déc. 2017 à 10:42
Maintenent le probleme se pose dans l'appel de la fct selctl avec GETALL
0