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 :

semaphore semid = semget => -1


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut semaphore semid = semget => -1
    Bonsoir,

    J'ai petit problème avec les sémaphores, c'est sûrement trois fois rien mais il n'empêche que cela me bloque dans ma progression .
    Voici mon cas, la fonction semget me renvoie -1 avec le message de perror à "No space left on device".
    voici comment est écrit semget :

    semid = semget (key, 1, IPC_R | IPC_A | IPC_CREAT | IPC_EXCL);

    toute suggestion est la bienvenue, si il faut plus de code n'hésitez pas à me le demander.
    Merci .

    P.S. je suis sous OpenBSD 4.4

  2. #2
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut
    Bonjour,
    Voici le code complet, alors l'idée c'est de tester les sémaphores et la communication inter processus (IPC) en partageant une zone mémoire. Une fois cela fait je duplique le processus et j'incrémente la zone mémoire par le fils et par le père alternativement. Du moins c'est ce que j'espère avoir écrit pour ce brave CPU.

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <signal.h>
    #include <sys/wait.h>
     
    void wait_sem (int i_sig)
    {
    }
    int main (void)
    {
    	int *zone;
    	int memid;
    	int semid;
    	pid_t pid1;
    	pid_t pid2;
    	union semun argument;
    	struct sigaction wait_incr;
    	sigset_t all;
    	key_t key;
     
    	memid = shmget (IPC_PRIVATE, 100, IPC_CREAT);
     
    	pid1 = getpid ();
    	if (memid == -1)
    	{
    		perror ("UNABLE TO CREATE THE SHARED MEMORY\n");
    		return (EXIT_FAILURE);
    	}
     
    	wait_incr.sa_handler = wait_sem;
    	sigemptyset (&wait_incr.sa_mask);
    	sigemptyset (&all);
    	key = ftok ("/path/file.x", 'E');
    	semid = semget (key, 1, IPC_EXCL | SEM_R | SEM_A | IPC_CREAT);
     
    	if (semid == -1)
    	{
    		perror ("UNABLE TO CREATE THE SEMAPHORE\n");
    		return (EXIT_FAILURE);
    	}
     
    	zone = shmat (memid, NULL, 0);
    	zone[0] = 34;
    	printf ("process pid1 = %d & zone[0] = %d\n", pid1, zone[0]++);
     
    	pid2 = fork ();
    	if (pid2 < 0)
    	{
    		perror ("FORK HAS FAILED\n");
    		return (EXIT_FAILURE);
    	}
     
    	/* child's process */
     
    	else if (pid2 == 0)
    	{
    		pid2 = getpid ();
    		argument.val = 0;
    		semctl (semid, 0, SETVAL, argument); 
    		while (1)
    		{
    			if (semctl (semid, 0, GETVAL, argument) == 1)
    			{
    				sigaction (SIGUSR1, &wait_incr, (struct sigaction *) 0);
    				printf ("process pid2 = %d & zone[0] = %d\n", pid2, zone[0]++);
    				semctl (semid, 0, SETVAL, argument);
    				kill (pid1, SIGUSR1);
     
    				sigsuspend (&all);
     
    			}
    		}
    		return (EXIT_SUCCESS);
    	}
     
    	/* father's process */
     
    	else
    	{
    		argument.val = 1;
    		semctl (semid, 0, SETVAL, argument); 
    		while (1)
    		{
    			if (semctl (semid, 0, GETVAL, argument) == 0)
    			{
    				sigaction (SIGUSR1, &wait_incr, (struct sigaction *) 0);
    				printf ("process pid1 = %d & zone[0] = %d\n", pid1, zone[0]++);
    				semctl (semid, 0, SETVAL, argument);
    				kill (pid2, SIGUSR1);
     
    				sigsuspend (&all);
     
    			}
    		}
    	}
    	return (EXIT_SUCCESS);
    }
    Toute aide est la bienvenue surtout en ce qui concerne le return -1 de semget(...) mais si d'autres erreurs sont trouvées n'hésitez pas à m'en faire part.

    voici la page de manuel de semget () sous openBSD : http://www.openbsd.org/cgi-bin/man.c...86&format=html

    Merci

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut
    Le problème venait de ftok, avec IPC_PRIVATE tout est parfait
    Enfin sauf que l'alternance de mes processus pour l'incrémentation ne fonctionne pas

    Je continue donc à chercher, si quelqu'un voit une de mes bourdes qu'il n'hésite pas.
    Je sais que l'on est dimanche et que c'est le début des vacances donc ... j'avoue n'avoir guère d'espoir.

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

Discussions similaires

  1. Pthread et semaphores
    Par Yabo dans le forum Linux
    Réponses: 9
    Dernier message: 30/03/2008, 00h09
  2. Réponses: 1
    Dernier message: 07/04/2006, 13h35
  3. Semaphore sous Delphi
    Par riou93 dans le forum Langage
    Réponses: 1
    Dernier message: 31/08/2005, 13h50
  4. gestion de semaphore sous builder
    Par buzzz dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/02/2005, 12h43
  5. Semaphore (operation Z)
    Par zehle dans le forum Linux
    Réponses: 3
    Dernier message: 12/01/2005, 21h30

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