Devices Under the UNIX Operating System

BBj-Specific Information

In BBj, the operating system level call to open a system device occurs in BBjServices. For instance, if the device is a pseudo-terminal, the BBjServices process may not have permissions or access to the given terminal.

There is another ramification with respect to terminal devices. In many UNIX environments, the special device /dev/tty will open the terminal to which the current process is connected. Because it is the BBjServices process that opens devices, opening /dev/tty will open the terminal connected to BBjServices. This is most likely not the same terminal as the bbj process started by the user. In general, opening /dev/tty within BBjServices is not a useful concept.

PRO/5-Specific Information

OPEN

The OPEN verb will also open system devices. After opening, the PRO/5 filesystem will determine whether the opened device is a block or character device. If it is a block device, the IND=int option will be allowed during READ and WRITE calls; int is passed to the device driver using the "lseek(2)" system call. There are no limits on the minimum or maximum length of records applied by PRO/5 to devices.

If you are attempting to use serial devices, you should be aware of some of the problems you may encounter. Most of these problems involve the settings of baud rate, word size, etc. on the port through the "stty" command. These settings take on the driver's default settings on the first open of the device on the system. A shell script designed to handle these problems is provided with PRO/5; this is called "openport." This script is designed to execute as a background process and as such, is invoked in the following manner:

openport /dev/tty01 1200 ixon ixoff -ixany &

This opens the "/dev/tty01" device and, via "stty", sets the port parameters to those of "openport" plus any modes you specify on the port. The script then sleeps forever (killed by the next shutdown or your log out). If you have to use this command frequently (perhaps to setup a serial printer), you may consider placing it in your system's status scripts, e.g., in "/etc/rc."

The "openport" script willnotfunction properly when run under the "c-shell."

Pipes in PRO/5 and BBj

Note:

In PRO/5 15.01 and higher, and BBj 15.10 and higher, the OPEN verb by default is restricted from opening pipes (commands starting with "<", ">", or "|") in console mode. This is to protect against accidentally overwriting a data file as a side effect of inadvertently specifying a pipe expression. To open a pipe at the console, set SETOPTS byte 9 bit $10$ or include MODE="PIPE" in the OPEN.

PRO/5 and BBj will allow you to open inter-process communication channels called "pipes." A pipe is created by starting the name with the character: "<" for a read pipe, ">" for a write pipe, and "|" for a bi-directional pipe (both read and write). An attempt to read or write to a broken pipe (one which has lost its other end) will result in an !ERROR=2 (!ERROR=0 if the pipe is ALIASed as a printer).

When opening a pipe, PRO/5 and BBj will perform some argument replacement in the command line passed to the shell. Anything in the command line starting with a "$" character and ending in a non-alphanumeric character is searched for in the modes specified in the OPEN "MODE=" string and then the modes in the ALIAS entry (if the OPEN name was found in the ALIAS list). Typical replacements are "COPIES" and "FORM", both of which are normally used in spooling. See Modes Common to All ALIAS Devices.

If you need to close the "write" end of a bi-directional pipe, the following will close the write handle, leaving the read handle alone:

WRITE {RECORD}((channelno),IND=0)

Any further attempt to write to the channel will generate an error.

A pipe is a mechanism that allows First-In, First-Out (FIFO) communications flow. Pipes can be unnamed as is the case when they are created with the characters "<", ">", and "|", or pipes can be named. Named pipes have the advantage that many processes can read and write to them because they are registered with the filesystem (therefore, visible). Additionally, because named pipes are FIFO structured, they guarantee first come, first serve delivery of messages (data). Please consult your UNIX documentation for a more thorough description of pipes. In particular, see Intro(2) and Mknod(1).

"Ghost" Tasks

On multi-tasking systems such as the UNIX operating system, PRO/5 supports the definition of an ALIAS which, when opened, will run as a background process. For example the following will cause an invocation PRO/5 with BBTERM set to "G0" when an OPEN of the G0 device is done within PRO/5:

ALIAS G0 "|BBTERM=G0 pro5"

This starts PRO/5 at the end of a bi-directional pipe. As an alternative, the SCALL() function may be used with a trailing ampersand (&), or from PRO/5 console mode, the system call function (!) can be used to start background tasks in UNIX. The console mode system call function is covered under Additional PRO/5 Command Information For the UNIX Operating System. Note that you may also use the BACKGROUND verb.