> - Will this shared memory be accessible to non rt-task ?
 > - What's the simplest way to share information with a non rt-task ?

Shared memory are also accessible to non-rt tasks. Since user-space
realtime and non-realtime threads from the same process reside in the
same address space, the simplest way to share information from rt to
non-rt tasks is to create them as threads of the same process.
Ok, but I figure out that it's possible to share memory between processes ? (rt and non rt?)
For the moment, i focus on sharing between two rt tasks, but in vain :(
I still have a ftruncate error (EBADF) when i launch two rt processes...
I explain :
I've tried the attached program. I've added a sleep(1) between mmap and munmap. I launch this appli twice with
>> shm_test &
>> shm_test &
For the second one, I got "ftruncate: Invalid argument". Am I the only one to have this problem ?



#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#define MAX_LEN 10000
struct region {        /* Defines "structure" of shared memory */
    int len;
    char buf[MAX_LEN];
};
struct region *rptr;
int fd;



int main(int argc, const char *argv[])
{
    int fd, status;

    mlockall(MCL_CURRENT|MCL_FUTURE);

/* Create shared memory object and set its size */

    fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd == -1) {
        perror("shm_open");
        exit(EXIT_FAILURE);
    }
    
    if ((status = ftruncate(fd, sizeof(struct region))) == -1) {
        /* Handle error */;
        perror("ftruncate");
        close(fd);
        status = EXIT_FAILURE;
        goto close_and_unlink;
    }


/* Map shared memory object */
    rptr = (struct region *) mmap(NULL,
                                  sizeof(struct region),
                                  PROT_READ | PROT_WRITE,
                                  MAP_SHARED,
                                  fd,
                                  0);
    if (rptr == MAP_FAILED) {
        /* Handle error */;
        perror("mmap");
        status = EXIT_FAILURE;
        goto close_and_unlink;
    }
    

        
/* Now we can refer to mapped region using fields of rptr;
   for example, rptr->len */
        sleep(1);


    munmap(rptr, sizeof(struct region));
  close_and_unlink:
    close(fd);
    shm_unlink("/myregion");

    return status;
}
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to