Guardian Programmer's Guide
Table Of Contents
- Guardian Programmer’s Guide
 - Contents
 - What’s New in This Manual
 - About This Manual
 - Legal Notices
 - 1 Introduction to Guardian Programming
 - 2 Using the File System
 - 3 Coordinating Concurrent File Access
 - 4 Using Nowait Input/Output
 - 5 Communicating With Disk Files
- Types of Disk Files
 - Using Unstructured Files
- Creating Unstructured Files
 - Opening Unstructured Files
 - Positioning, Reading, and Writing With Unstructured Files
 - Locking With Unstructured Files
 - Renaming Unstructured Files
 - Avoiding Unnecessary Cache Flushes to Unstructured Files
 - Closing Unstructured Files
 - Purging Unstructured Files
 - Altering Unstructured-File Attributes
 
 - Using Relative Files
 - Using Entry-Sequenced Files
 - Using Key-Sequenced Files
- Creating Key-Sequenced Files
 - Opening Key-Sequenced Files
 - Positioning, Reading, and Writing With Key-Sequenced Files
 - Locking, Renaming, Caching, Closing, Purging, and Altering Key-Sequenced Files
 - Key-Sequenced File Programming Example
 - Using Alternate Keys With an Entry-Sequenced File
 - Using Alternate Keys With a Key-Sequenced File
 
 - Using Partitioned Files
 - Using Alternate Keys
 
 - 6 Communicating With Processes
- Sending and Receiving Messages: An Introduction
 - Sending Messages to Other Processes
 - Queuing Messages on $RECEIVE
 - Receiving and Replying to Messages From Other Processes
 - Receiving Messages From Other Processes: One-Way Communication
 - Handling Multiple Messages Concurrently
 - Checking for Canceled Messages
 - Receiving and Processing System Messages
 - Handling Errors
 - Communicating With Processes: Sample Programs
 
 - 7 Using DEFINEs
 - 8 Communicating With a TACL Process
 - 9 Communicating With Devices
 - 10 Communicating With Terminals
 - 11 Communicating With Printers
 - 12 Communicating With Magnetic Tape
- Accessing Magnetic Tape: An Introduction
 - Positioning the Tape
 - Reading and Writing Tape Records
 - Blocking Tape Records
 - Working in Buffered Mode
 - Working With Standard Labeled Tapes
- Enabling Labeled Tape Processing
 - Creating Labeled Tapes
 - Checking for Labeled Tape Support
 - Accessing Labeled Tapes
 - Writing to the Only File on a Labeled Tape Volume
 - Writing to a File on a Multiple-File Labeled Tape Volume
 - Writing to a File on Multiple Labeled Tape Volumes
 - Reading From the Only File on a Labeled Tape Volume
 - Reading From a File on a Multiple-File Labeled Tape Volume
 - Reading From a File on Multiple Labeled Tape Volumes
 
 - Accessing a Labeled Tape File: An Example
 - Working With Unlabeled Tapes
 - Terminating Tape Access
 - Recovering From Errors
 - Accessing an Unlabeled Tape File: An Example
 
 - 13 Manipulating File Names
 - 14 Using the IOEdit Procedures
 - 15 Using the Sequential Input/Output Procedures
- An Introduction to the SIO Procedures
 - Initializing SIO Files Using TAL or pTAL DEFINEs
 - Opening and Creating SIO Files
 - Getting Information About SIO Files
 - Reading and Writing SIO Files
 - Accessing EDIT Files
 - Handling Nowait I/O
 - Handling Interprocess Messages
 - Handling System Messages
 - Handling BREAK Ownership
 - Handling SIO Errors
 - Closing SIO Files
 - Initializing SIO Files Without TAL or pTAL DEFINEs
 - Using the SIO Procedures: An Example
 
 - 16 Creating and Managing Processes
 - 17 Managing Memory
- An Introduction to Memory-Management Procedures
 - Managing the User Data Areas
 - Using (Extended) Data Segments
- Overview of Selectable Segments
 - Overview of Flat Segments
 - Which Type of Segment Should You Use?
 - Using Selectable Segments in TNS Processes
 - Accessing Data in Extended Data Segments
 - Attributes of Extended Data Segments
 - Allocating Extended Data Segments
 - Checking Whether an Extended Data Segment Is Selectable or Flat
 - Making a Selectable Segment Current
 - Referencing Data in an Extended Data Segment
 - Checking the Size of an Extended Data Segment
 - Changing the Size of an Extended Data Segment
 - Transferring Data Between an Extended Data Segment and a File
 - Moving Data Between Extended Data Segments
 - Checking Address Limits of an Extended Data Segment
 - Sharing an Extended Data Segment
 - Determining the Starting Address of a Flat Segment
 - Deallocating an Extended Data Segment
 
 - Using Memory Pools
 
 - 18 Managing Time
 - 19 Formatting and Manipulating Character Data
- Using the Formatter
 - Manipulating Character Strings
 - Programming With Multibyte Character Sets
- Checking for Multibyte Character-Set Support
 - Determining the Default Character Set
 - Analyzing a Multibyte Character String
 - Dealing With Fragments of Multibyte Characters
 - Handling Multibyte Blank Characters
 - Determining the Character Size of a Multibyte Character Set
 - Case Shifting With Multibyte Characters
 - Testing for Special Symbols
 - Sample Program
 
 
 - 20 Interfacing With the ERROR Program
 - 21 Writing a Requester Program
 - 22 Writing a Server Program
 - 23 Writing a Command-Interpreter Monitor ($CMON)
- Communicating With TACL Processes
 - Controlling the Configuration of a TACL Process
 - Controlling Logon and Logoff
 - Controlling Passwords
 - Controlling Process Creation
 - Controlling Change of Process Priority
 - Controlling Adding and Deleting Users
 - Controlling $CMON While the System Is Running
 - Writing a $CMON Program: An Example
 - Debugging a TACL Monitor ($CMON)
 
 - 24 Writing a Terminal Simulator
 - 25 Debugging, Trap Handling, and Signal Handling
 - 26 Synchronizing Processes
 - 27 Fault-Tolerant Programming in C
- Overview of Active Backup Programming
 - Summary of Active Backup Processing
 - What the Programmer Must Do
 - C Extensions That Support Active Backup Programming
- Starting the Backup Process
 - Opening a File With a Specified Sync Depth
 - Retrieving File Open State Information in the Primary Process
 - Opening Files in the Backup Process
 - Retrieving File State Information in the Primary Process
 - Updating File State Information in the Backup Process
 - Terminating the Primary and Backup Processes
 
 - Organizing an Active Backup Program
 - Updating State Information
 - Providing Communication Between the Primary and Backup Processes
 - Programming Considerations
 - Comparison of Active Backup and Passive Backup
 - Active Backup Example 1
 - Active Backup Example 2
 
 - 28 Using Floating-Point Formats
- Differences Between Tandem and IEEE Floating-Point Formats
 - Building and Running IEEE Floating-Point Programs
 - Compiling and Linking Floating-Point Programs
 - Link-Time Consistency Checking
 - Run-Time Consistency Checking
 - Run-Time Support
 - Debugging Options
 - Conversion Routines
 - Floating-Point Operating Mode Routines
 
 - A Mixed Data Model Programming
 - Glossary
 - Index
 
Fault-Tolerant Programming in C
Guardian Programmer’s Guide — 421922-014
27 - 55
Program Declarations
•
MONITORCPUS, which is called by the backup process to monitor the primary 
process CPU.  The operating system sends the backup process a “processor 
down” message if the monitored CPU fails.
•
PROCESS_GETINFO_, PROCESS_GETPAIRINFO_, and 
PROCESSHANDLE_DECOMPOSE_, which are used to obtain information about 
the primary and backup processes.
•
PROCESS_STOP_, which is called by the primary process to stop the backup 
process if an end-of-file is encountered in the input file.
•
PROCESSHANDLE_COMPARE_, which is called by the backup process to 
determine if a message it received was sent by the primary process.
•
READUPDATEX, which is called by the backup process to receive messages from 
the primary process through $RECEIVE.
•
REPLYX, which is called by the backup process to reply to messages it receives.
•
WRITEX, which is called by the primary process to send messages to the backup 
process.
Message Declarations
The program uses four message formats:  two defined by the operating system and 
two defined by the program.
•
CPU_DOWN is a system message that indicates that a monitored CPU is down. 
This message is used to notify the backup process if the primary process CPU fails 
so that the backup process can take over processing.
•
PROCESS_DELETION is a system message that indicates that a process has 
terminated. This message is used to notify the backup process if the primary 
process terminates so that the backup process can take over processing.
•
UPDATE_OPEN is an application-defined message that contains the open state 
information for the input and output files.
•
UPDATE_MESSAGE is an application-defined message that contains the current 
state information needed by the backup process to define a continuation point and 
update its memory.
The message declaration portion of the program serves the following purposes:
•
Provides macros that define the message numbers. Note that the system 
message numbers are negative and the application-defined message numbers are 
positive.
•
Declares a structure for each of the four message formats. The first member of the 
structure contains the message number, and the second member is a union with 
one member per message format. The information contained in the system 
messages is not used (only the message number is used), so the exact structure is 
not defined.










