Hello,

I'm writing an application using Message queue and mq_send returns the errno
value EBADF.
I don't understand what I'm doing wrong, I need some help.

Here's my code :


pthread_t task1, task2;

pthread_mutex_t mutex;



void routine1 (void * cookie);

void routine2 (void * cookie);



int tab[200];

int DESTRUCT=0;



mqd_t mq1, mq2;

#define MAX_MSGS        5

#define MSG_SIZE        50

char buf1[MSG_SIZE];

char buf2[MSG_SIZE];



void affich(int toto)

{

           static int cpt = 0;

           pthread_mutex_lock(&mutex);

           tab[cpt] = toto;

           cpt ++;

           if(cpt == 150){

                       cpt = 0;

           }

           pthread_mutex_unlock(&mutex);

}



void routine1 (void * cookie){

           int ret;

           struct sched_param param = {.sched_priority = 10 };

           pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);



           for(;;){

                       affich(1);

                       ret = mq_receive(mq2, buf2,MSG_SIZE, NULL);

                       printf("receive mq2 returned %d, errno %d\n", ret,
errno);

                       ret = mq_send(mq1, buf1, MSG_SIZE, 0);

                       printf("send mq1 returned %d, errno %d\n", ret,
errno );

                       if(DESTRUCT==1){

                                  pthread_exit(NULL);

                       };

           }

}



void routine2 (void * cookie){

           int ret;

           struct sched_param param = {.sched_priority = 10 };

           pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);

           for(;;){

                       affich(2);

                       ret = mq_send(mq2, buf2, MSG_SIZE, 0);

                       printf("send mq2 returned %d, errno %s\n", ret,
errno );

                       ret = mq_receive(mq1, buf1, MSG_SIZE, NULL );

                       printf("receive mq1 returned %d, errno %s\n", ret,
errno);

                       if(DESTRUCT==1){

                                   pthread_exit(NULL);

                       };

           }

}



void cleanup_upon_sig(int sig __attribute__((unused)))

{

           DESTRUCT=1;

}



int main(int argc, char **argv)

{

           int i = 0;

           int err;

           sigset_t mask, oldmask;

           pthread_attr_t attr1, attr2;

           struct sched_param param1 = {.sched_priority = 10 };

           struct sched_param param2 = {.sched_priority = 10 };

           struct mq_attr qattr1, qattr2;



           mlockall(MCL_CURRENT | MCL_FUTURE);



           /*création du mutex*/

           pthread_mutex_init(&mutex,NULL);



           /*création des Message_queue*/

           qattr1.mq_maxmsg = MAX_MSGS;

           qattr1.mq_msgsize = MSG_SIZE;

           qattr2.mq_maxmsg = MAX_MSGS;

           qattr2.mq_msgsize = MSG_SIZE;



           if (mq1=mq_open("/mq1", O_CREAT|O_RDWR, 0, &qattr1) ==
(mqd_t)(-1)) {

               perror( "mq1_open failed" );

               exit(1);

       }

           if (mq2=mq_open("/mq2", O_CREAT|O_RDWR, 0, &qattr2) ==
(mqd_t)(-1)) {

               perror( "mq2_open failed" );

               exit(1);

       }



           sigemptyset(&mask);

           sigaddset(&mask, SIGINT);

           signal(SIGINT, cleanup_upon_sig);

           sigaddset(&mask, SIGTERM);

           signal(SIGTERM, cleanup_upon_sig);

           sigaddset(&mask, SIGHUP);

           signal(SIGHUP, cleanup_upon_sig);



           pthread_sigmask(SIG_BLOCK, &mask, &oldmask);



           /*Initialisation des attributs des tâches*/

           pthread_attr_init(&attr1);

           pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_JOINABLE);

           pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED);

           pthread_attr_setschedpolicy(&attr1, SCHED_FIFO);

           pthread_attr_setschedparam(&attr1, &param1);

           pthread_attr_setstacksize(&attr1, PTHREAD_STACK_MIN);



           pthread_attr_init(&attr2);

           pthread_attr_setdetachstate(&attr2, PTHREAD_CREATE_JOINABLE);

           pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED);

           pthread_attr_setschedpolicy(&attr2, SCHED_FIFO);

           pthread_attr_setschedparam(&attr2, &param2);

           pthread_attr_setstacksize(&attr2, PTHREAD_STACK_MIN);



           if (err = pthread_create (&task1,&attr1,(void *)routine1,NULL))

                       fprintf(stderr, "failed to create threads: %s\n",
strerror(err));



           if (err = pthread_create (&task2,&attr2,(void *)routine2,NULL))

                       fprintf(stderr, "failed to create threads: %s\n",
strerror(err));



           pthread_sigmask(SIG_UNBLOCK, &mask, &oldmask);



           pthread_join(task1, NULL);

           pthread_join(task2, NULL);



           /*destruction mutex*/

           if (err = pthread_mutex_destroy(&mutex))

                       fprintf(stderr, "failed to cancel mutex");



           /*destruction message_queue*/

           if( mq_close(mq1) == -1 ) {

               perror( "mq1_close failed" );

               exit(1);

       }

           if( mq_close(mq2) == -1 ) {

               perror( "mq2_close failed" );

               exit(1);

       }



           for(i = 0; i < 20 ; i++)

                       {

                                  printf("Task %d\n",tab[i]);

                       }

return 0;

}



Thanks
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to