Hi,
I’am testing Posix semaphores on Qnx. I get some troubles when I want to
wait an unnamed semaphore in a child process. Sem_wait returns -1 and errno
is set to 22 (EINVAL).
Could some one help me?
Thanx
Here is the code :
#include<unistd.h>
#include<semaphore.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<signal.h>
void Process_Fils(void);
void Handler_SigInt(int sig);
/* DECLARATIONS POUR L’UTILISATION D’UN SEMAPHORE NON NOMME */
sem_t sem,*ptr_sema = &sem;
int pshared = 1;
unsigned int value = 1;
int sem_val,*ptr_sem_val = &sem_val;
int ret_val;
int fils;
struct sigaction sig_act;
main()
{
struct timespec Time;
sig_act.sa_handler = Handler_SigInt;
ret_val = sigaction (SIGINT,&sig_act, 0);
if (ret_val == -1)
perror("\n\rMAIN : sigaction failed !!!");
/* ------------------------------------------------------------
CREATION D’UN SEMAPHORE NON NOMME
IDENTIFICATEUR : ptr_sema,
SHARED : pshared = TRUE,
VALEUR INITIALE : value = 1.
------------------------------------------------------------ */
ret_val = sem_init (ptr_sema, pshared, value);
if (ret_val == -1)
perror("\n\rMAIN : sem_open failed !!!");
fils = fork();
if (!fils)
{
Process_Fils();
}
while (1)
{
Time.tv_sec = 2;
Time.tv_nsec = 0;
nanosleep(&Time,NULL);
/* ------------------------------------------------------------
VALIDER UN SEMAPHORE
IDENTIFICATEUR : ptr_sema
------------------------------------------------------------ */
ret_val = sem_post (ptr_sema);
if ( ret_val == -1)
perror ("\n\rMAIN : sem_post failed !!!");
}
}
void Process_Fils (void)
{
int compteur = 0;
signal(SIGINT,SIG_IGN);
printf(“Ptr = %x\n”,ptr_sema);
while (1)
{
/* ------------------------------------------------------------
ATTENDRE UN SEMAPHORE
IDENTIFICATEUR : ptr_sema
------------------------------------------------------------ */
ret_val = sem_wait (ptr_sema);
printf(“errno = %d, ret_val = %d\n”,errno,ret_val);
if (ret_val == -1)
perror ("\n\rMAIN : sem_wait failed !!!");
compteur++;
printf("\nCompteur = %d",compteur);
}
}
void Handler_SigInt(int sig)
{
/* ------------------------------------------------------------
DESTRUCTION D’UN SEMAPHORE NON NOMME
IDENTIFICATEUR : ptr_sema.
------------------------------------------------------------ */
ret_val = sem_destroy (ptr_sema);
if ( ret_val == -1)
perror("\n\rMAIN : sem_unlink failed !!!");
kill(fils,SIGKILL);
exit(0);
}