HP OpenVMS Systems

ask the wizard
Content starts here

RMS shared file access in C?

» close window

The Question is:

 
Dear Wizard,
 
I am porting a UNIX program for scanning logfiles, and have run
into a few snags. The first I have been told is impossible (opening
a file and fseek'ing back and forth and using fgets() to read the
data) because of limitations in the C RTL. This I have worked around. But
now that the program is completed and I am testing on "real" logfiles I find
that I am unable to access these. The fopen() function  (which opens the
file read-only ) returns with a
n error message indicating that the file is locked by another process.  Is
there no way of opening a file for reading from standard C (that is non-RMS
functions) if another process is using that file? I
 
 have attempted to set flags for sharing (shr=get looked most promising) but
am getting nowhere.  If this is not possible without using RMS functions
please point me to some sample code, as I have never used these functions
before and am more than a littl
e intimidated by the apparent amount of code needed to do seemingly simple
things ;-)
 
Thank you in advance for your sage advice!
 
PS: If it is relevant I am using DecC v6
 
 


The Answer is :

 
  The fopen option:
 
    "shr=get,upd,put"
 
  or similar is commonly used, in conjunction with periodic calls
  to the routines:
 
    fsync(fileno(fp))
 
  and
 
    fflush(fp)
 
  Note: the more calls to fsync and fflush, the slower things get.
 
  See the documentation on the creat call for details, as well as
  the RMS documentation.
 
  One example would be:
 
    fopen(file,"w","shr=get","ctx=rec","fop=dfw");
 
  with readers opening the file with "shr=get".
 
  A full example is attached below.
 
  Also please see "C stdout and log files? message logging?" in topic
  (2078) here in the Ask The Wizard area.  Also see the RMS_EXAMPLES.C
  module found in SRH_EXAMPLES directory on the OpenVMS Freeware V4.0
  and V5.0 distributions -- this example shows native RMS calls and the
  FAB and RAB structures in the context of a C application program.
 
	--
 
#include <signal.h>
#include <ssdef.h>
#include <stdio.h>
#define LOOPMAX 50
#define LOOPINT 3
main()
  {
  FILE    *fp;
  char    *fn = "sys$scratch:tmp.tmp";
  int     i;
 
  printf( "Opening scratch file %s for shared access...\n", fn );
  printf( "This application writes to the shared file...\n");
  fp = fopen( fn, "w", "shr=get", "rat=cr", "rfm=var", "ctx=rec" );
  for ( i = 0; i < LOOPMAX; i++ )
    {
    printf( "Iteration count: %d\n", i );
    fprintf( fp, "Iteration count: %d\n", i );
    fsync( fileno( fp ));
    sleep( LOOPINT );
    }
  printf( "Done.\n" );
  printf( "Please delete scratch file %s ...\n", fn );
 
  return SS$_NORMAL;
  }
 
        --
 
#include <signal.h>
#include <ssdef.h>
#include <stdio.h>
#define LOOPMAX 50
#define TEXTMAX 100
#define LOOPINT 3
main()
  {
  FILE    *fp;
  char    *fn = "sys$scratch:tmp.tmp";
  char    txt[TEXTMAX];
  int     i;
 
  printf( "Opening scratch file %s for shared access...\n", fn );
  printf( "This application reads from the shared file...\n");
  fp = fopen( fn, "r", "shr=get,put,upd", "rat=cr", "rfm=var", "ctx=rec" );
  for ( i = 0; i < LOOPMAX; i++ )
    {
    fgets( txt, TEXTMAX, fp );
    printf( "Read: <%s>\n", txt );
    sleep( LOOPINT );
    }
  printf( "Done.\n" );
 
  return SS$_NORMAL;
  }
 
 
 

answer written or last revised on ( 18-OCT-2001 )

» close window