HP OpenVMS Systemsask the wizard |
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;
}
|