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

Writing a Command-Interpreter Monitor ($CMON)
Guardian Programmer’s Guide — 421922-014
23 - 3
Communicating With TACL Processes
When the user issues an ADDUSER command, the ADDUSER process sends the
ADDUSER message directly to the $CMON process (it does not come from the TACL
process). Similarly, the DELUSER message is received from the DELUSER program,
the PASSWORD message is received from the PASSWORD program, and the
REMOTEPASSWORD message from the RPASSWRD program. For convenience, as
well as historical consistency, these messages are still referred to as command-
interpreter messages.
After processing a command-interpreter message, $CMON sends a reply back to the
TACL process (or other process that sent the message) using a call to the REPLY
procedure. Each of the command-interpreter messages that contains a request has a
specific reply format that the TACL process expects. Some of the reply messages
have two possible formats; which one you choose usually depends on whether your
$CMON process accepts or rejects the request. This section describes with examples
the responses that a $CMON process can take for each of these messages. The
Guardian Procedure Errors and Messages Manual also describes these messages,
arranged numerically for ease of reference.
The following actions are also taken by the TACL process while communicating with
the $CMON process:
•
The TACL process sends all requests on a nowait basis; if a message cannot be
sent, or if $CMON does not reply, the TACL process closes the $CMON file and
proceeds to execute the command as if $CMON did not exist.
•
If the BREAK key is pressed while a message is outstanding to $CMON and the
user logged on to the TACL process is not the super ID (255, 255), the message
is canceled and the command is aborted. If the BREAK key is pressed while a
message is outstanding and the user logged on to the TACL process is the super
ID, the message is canceled and the command is executed.
•
If the TACL process encounters an I/O error when communicating with $CMON, it
closes the $CMON file and abandons the current request. The TACL process tries
to reopen $CMON and attempts communication when the next monitored
command is issued.
Note. Do not confuse command-interpreter messages with system messages; their message
numbers do overlap. Command-interpreter messages are user messages supplied in a
specific format. Unlike system messages, you do not get an error condition on reading a
command-interpreter message.