HP OpenVMS Systems

ask the wizard
Content starts here

Primitive C file operations?

» close window

The Question is:

 
Question: Is there anyway to switch off RMS?
 
We have an application that has been ported to 7 different UNIX platforms
and Windows-NT successfully and we are now trying to port to VMS.
 
Our application will start up 3 (or more) independent processes which
will access central "database" files. These central database files consits
of a set of fix length records, which can either be read/updated/deleted
or a new one appended to the end.
 
To be portable across different OS's we made it *very* simple. We only
use open (), read (), write () lseek () and close ().
 
It is quite normal for a file to open by two or more processes at one
time and we use semaphores, so only one transaction (either read or write)
is in operation at anyone time! Therefore no locking is required (or
assumed) in the operating system.
 
Each transaction is a simple lseek () followed by a read () or write ().
This is *VERY* simple record system as all records are fixed size - it
does precisely what we need and has been *very* portable.
 
 
 
So far we have tried using:
 
        fd = open (file, O_RDWR, 0644, "ctx=rec", "shr=mse", "shr=upi",
                   "shr=del", "shr=put", "shr=upd", "rop=rrl");
 
The first question has to be are these the settings we should be using?
Ideally we would like to open a simple file, no record services, no RMS
etc.
 
Secondly, am I correct in assuming that all writes in VMS are synchronous?
This would be ideal for us, so we know what when the write () finished,
all the other processes with this file open on the system have latest data.
 
Thirdly, the main  problem we have seen, is that when we try and add a
record to the end of the file, we lseek () to the end and the write ()
fails with errno 65535 (end of file detected).
 
We might be doing a major BOBO here with the way we open the file i.e. the
settings but the C-documentation does not give any major lead.
 
Best Regards  & Thanks for this excellent service
 
Arve
 
 
 


The Answer is :

 
  The basic record management system used in OpenVMS is RMS.  It can
  operate synchronously or asynchronously.  RMS is layered onto the
  file system interface provided by the OpenVMS XQP.  By default, RMS
  access is synchronous (see the asynchronous option if you want to
  turn this off), and all RMS caches are kept coherent across multiple
  accessors across all nodes in the cluster.
 
  The C run-time library emulates the UNIX file system using RMS, and
  this is likely where you will run into most of your problems -- you
  are not looking to use the UNIX file system, you have a very simple
  file system of your own in mind here.
 
  An example of a moderately complex open is:
 
    fp = open( filename, "w",
               "ctx=bin,rec",        /*  Record mode, no newline */
               "shr=get,put,upd,del" /*  File access sharing     */
               "mbf=10",             /*  Multi-buffer count      */
               "mrs=0",              /*  Maximum record size     */
               "rat=none",           /*  Record attribute        */
               "rfm=fix",            /*  Record format           */
               "rop=wbh" );          /*  Write behind caching    */
 
  You may well want to open the file with "wb" or similar for the open
  call, as it appears you may have a binary file.
 
  While calls to the C RTL (or direct to RMS) can likely also be used,
  you are looking to disable the very reasons that most folks want to
  use C or RMS.
 
  When using memory semiphores, be very aware of the rules for accessing
  and interlocking memory, particularly on Alpha systems -- the rules are
  covered in the Alpha Architecture Reference Manual, as well as the VAX
  rules in the VAX Architecture Reference Manual for VAX systems.  When
  using disk-based semiphores, be very aware of the rules for accessing
  and keeping caches -- the XQP and RMS will keep the caches coherent for
  you.  If you wish your application to operate in a cluster, you will
  want to be aware of the ability for applications to operate and to share
  file access from other nodes.
 
  Given this particular situation (wishing to disable or bypass much of
  RMS and not even using the features of the file access routines in the
  C library), the Wizard would tend to create and utilize a set of small
  routines that call the low-level logical block accesses to the XQP file
  system directly.  The calls will be via sys$qio and/or the asychronous
  sys$qiow system service calls, specifying the READVBLK and WRITEVBLK
  itemcodes.  Start with a call to sys$open with the UFO option to open
  the file, then use the channel number returned in the RMS STV field
  and the information in the OpenVMS I/O User's Reference Manual to code
  up the necessary sys$qio and/or sys$qiow calls.
 
  At a slightly higher level, RMS can be used directly and can provide
  you with many advantages over direct use of sys$qio or sys$qiow.
  Using the more basic file formats (block, relative, or fixed-length
  sequential) you can perform most everything you will need to here.
 
  Example C source code is available from DSN and the customer support
  center, on the freeware CD-ROM, and various websites around the 'net.
 

answer written or last revised on ( 25-NOV-1998 )

» close window