Re: Information on use of Netsys.shm_open

Johan Mazel <[email protected]> Wed, 24 Mar 2010 13:25:48 +0100
Newsgroups gmane.comp.lang.ocaml.lib.net.devel
Message-ID <[email protected]>
2010/3/24 Gerd Stolpmann <[email protected]>

> On Mi, 2010-03-24 at 01:32 +0100, Johan Mazel wrote:
> >
> >
> > 2010/3/23 Gerd Stolpmann <[email protected]>
> >
> >         On Di, 2010-03-23 at 19:15 +0100, Johan Mazel wrote:
> >         > Hi
> >         > I'm trying this little piece of code to open a shared memory
> >         and
> >         > modify it.
> >         > The code looks like this :
> >         >
> >         > open Unix
> >         > open Bigarray.Array1
> >         >
> >         > let _ =
> >         >
> >         >     Printf.printf("Test shared memory\n");
> >         >
> >         >     if (Netsys.have_posix_shm () = false) then
> >         >
> >         >         Printf.printf "No POSIX SHM\n"
> >         >     else
> >         >         (
> >         >
> >         >             Printf.printf "POSIX SHM OK\n";
> >         >
> >         >             let shm_name = "/shm_test" in
> >         >
> >         >             let right_list = ref [] in
> >         >
> >         >             right_list := Netsys.SHM_O_CREAT :: !right_list;
> >         >             right_list := Netsys.SHM_O_RDWR :: !right_list;
> >         >
> >         >             ignore(
> >         >                     try
> >         >                         (
> >         >                             Printf.printf "Netsys.shm_open
> >         call\n";
> >         >
> >         >                             let sd = Netsys.shm_open
> >         shm_name !
> >         > right_list 1 in
> >         >
> >         >                             Printf.printf "Netsys.shm_open
> >         ok\n";
> >         >
> >         >                             let my_big_array =
> >         > Bigarray.Array1.map_file sd Bigarray.char Bigarray.c_layout
> >         true 100
> >         > in
> >         >
> >         >                             let big_array_size =
> >         Bigarray.Array1.dim
> >         > my_big_array in
> >         >
> >         >                             Printf.printf "Size of BigArray:
> >         %d\n"
> >         > big_array_size;
> >         >
> >         >                             Bigarray.Array1.set my_big_array
> >         0 'a';
> >         >                         )
> >         >                     with
> >         >                     | Unix_error (_ , invoked_function ,
> >         > shm_name_failure) ->
> >         >                             (
> >         >                                 Printf.printf
> >         >                                     "Opening failed through
> >         using
> >         > function %s on SHM %s\n"
> >         >                                     invoked_function
> >         >                                     shm_name_failure
> >         >                                 ;
> >         >                             )
> >         >                 );
> >         >
> >         >             Printf.printf "Shared memory tested\n";
> >         >         )
> >         >
> >         > I can create the shared memory file descriptor, but only
> >         once.
> >         > When I try to access it again (y rzlaunching my program,
> >         there is an
> >         > error on shm_open.
> >         >
> >         > I have to guess about a cause to this problem: first, I did
> >         not set
> >         > the right in the right manner and second, I do not use
> >         unlink.
> >         > The doc about the permissions is very light in this page
> >         >
> >         (
> http://projects.camlcity.org/projects/dl/ocamlnet-2.2.9/doc/html-main/Netsys.html).
> I tried with with 0, 1, 777 and none of these are working.
> >         > For the unlink function, my understanding is that it
> >         destroys the
> >         > file. But maybe, it has the same behviour as "close" in C
> >         for a file
> >         > descriptor.
> >
> >
> >         Well, shm_open just calls the C function with the same name,
> >         so for any
> >         detailed documentation see there.
> >
> > Which function does unlink call ? Because there is no unlink function
> > in the posix C shared memory API.
>
> shm_unlink
>
> >         Your guess is right, the error in your code is the bad
> >         permissions
> >         bitfield. 0o666 instead of 1 should be just ok to give
> >         everybody
> >         read/write access. The bitfield is interpreted as for any
> >         other file.
> >
> > Is there any doc available to know how to choose this code ?
>
> Your favourite Unix book. It is the same bitstring you can pass to the
> chmod command.
>
> Gerd
>

Hi
I understood that.
But is there any reason why I should use 0o666 to have the same behaviour as
777 for chmod ?

I have another question linked to the map_file command from Bigarray.
Does this command makes mandatory the use of the rights Netsys.SHM_O_RDWR in
the function shm_open and forbids the use of Netsys.SHM_O_RDONLY ?
It is a result of my tests, but I would like a confirmation.
I see this as a way to guarantee that the function set in Bigarray.genarray
(and others) will be available in any case, but I am not sure of my
interpretation.

An extra question would be what are the case when Netsys.SHM_O_RDONLY would
be useful if I cannot the use the result of shm_open in map_file ? In other
words are there use cases where one can use shm_open with
Netsys.SHM_O_RDONLY ?

Thanks for your time.

Johan Mazel

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev

_______________________________________________
Ocamlnet-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ocamlnet-devel