Printers and Interfaces

Printers and Interfaces

Under Linux, printing is managed and administered by several commands and files located in various parts of the system. The primary administrative directory is /usr/spool. Each printer that you have configured has its own subdirectory, /usr/spool/lpd/<name>, where <name> is the name of the printer. In this subdirectory, you will find status information about the printer, as well as information about the jobs currently being printed.

The actual printing is done by the lpd daemon. On system start-up, lpd is started through one of the rc scripts (normally somewhere under /etc/rc.d). As it starts, lpd looks through the printer configuration file, /etc/printcap, and prints any files still queued (normally after a system crash).

In each spool directory is a lock file that contains the process id (PID) of the lpd process. The PID helps keep multiple printer daemons from running and potentially sending multiple jobs to the same printer at the same time. The second line in the lock file contains the control file for the current print job.

Management of the print system, or print spool, is accomplished through the lpc utility. This is much more than a “command” because it performs a wide range of functions. One function is enabling printing on a printer. By default, there is probably one printer defined on your system (often lp). The entry is a very simple print definition that basically sends all the characters in the file to the predefined port. (For the default printer on a parallel port, this is probably /dev/lp1.)

When a job is submitted to a local printer, two files are created in the appropriate directory in /usr/spool. (For the default printer, this would be /usr/spool/lp1). The first file, starting with cf, is the control file for this print job. Paired with the cf file is the data file, which starts with df and is the data to be printed. If you are printing a pre-existing file, the df file will be a copy of that file. If you pipe a command to the lpr command, the df file will contain the output of the command. Using the -s option, you can force the system to create a symbolic link to the file to be printed.

The cf file contains one piece of information on each of several lines. The first character on each line is an abbreviation that indicates the information contained. The information contained within the cf file includes the name of the host from which the print job was submitted (H), the user/person who submitted the job (P), the job name (J), the classification of the print job (C), the literal string used on the banner page to identify the user (L), the file containing the data (this is the df file) (f), which file to remove or “unlink” when the job is completed (U), and the name of the file to include on the banner page (N). If you check the lpd man-page, you will find about a dozen more pieces of information that you could include in the cf file. However, this list represents the most common ones.

In the same directory, you will find a status file for that printer. This file is called simply “status” and normally contains a single line such as

printing disabled

If you were to re-enable the printer, the line would then change to

lp is ready and printing

Looking at this line, you might have noticed something that might seem a little confusing. (Well, at least it confused me the first time). That is, we’ve been talking about the directory lp1 all along, but this says the printer is lp. Does this mean that we are talking about two separate printers? No, it doesn’t. The convention is to give the directory the same name as the printer, but there is no rule that says you have to. You can define both the printer name and the directory any way you want.

This is probably a good time to talk about the printer configuration file, /etc/printcap. This file contains not only the printer definitions but the printer “capabilities” as well. In general, you can say the printcap file is a shortened version of the termcap file (/etc/termcap), which defines the capabilities of terminals.

In the printcap file, you can define a wide range of capabilities or characteristics, such as the length and width of each line, the remote machine name (if you are remote printing), and, as we discussed, the name of the spool directory. I will get into shortly what each of the entries means.

As we talked previously, the lpc command is used to manage the print spooler. Not only can you use it to start and stop printing, but you can use it to check the status of all the printer queues and even change the order in which jobs are printed.

There are two ways of getting this information and to manage printer queues. The first is to call lpc by itself. You are then given the lpc> prompt, where you can type in the command you want, such as start, disable, or any other administrative command. Following the command name, you must either enter “all,” so the command will be for all printers, or the name of the printer.

The lpc program will also accept these same commands as arguments. For example, to disable our printer, the command would be

lpc disable lp1

For a list of options, see the lpc man-page. A list of printer queue commands can be found in Table Print Queue Commands.

One aspect of the Linux print system that might be new to you is that you enable or disable the printing functionality within the kernel. Even though printer functionality is configured, you may not be able to print if you have hardware conflicts. When your run ‘make configure’ one of the options is to enable printing.

Once you have added the printer support to the kernel, the first thing you should do is test the connectivity by using the ls command and sending the output to the printer device. This will probably be /dev/lp0, /dev/lp1, or /dev/lp2, which corresponds to the DOS device LPT1, LPT2, and LPT3, respectively. For example, to test the first parallel port you could use

ls > /dev/lp0

What results is:

INSTALL@ dead.letter linux@ lodlin15.txt mbox tests/

However, if you were to issue the command without the redirection, it would probably look like this:

INSTALL@ dead.letter linux@ lodlin15.txt mbox tests/

The reason for this is that the ls command puts a single new-line character at the end of the line. Normally, the shell sees that new-line character and is told to add a carriage return onto the line. However, the printer has been told. Therefore, when it reaches the end of the line with the, just a new line is sent. Therefore, the printer drops down to the next (new) line and starts printing again. This behavior is called “stair-stepping” because the output looks like stair steps. When a carriage return is added, the shell returns back to the left of the screen as it adds the new line.

Table – Print Queue Commands




Printer control program


Print spooler daemon


Print program


Print queue administration program


Remove jobs from print queue


Convert text files for printing