This page contains a collection of topics on using Multics.
- 1 Logging In
- 2 Getting Around
- 3 Your start_up.ec
- 4 Abbrevs
- 5 Editing Files
- 6 Getting Help
- 7 Command Levels and Errors
- 8 Printing Files
Once you connect to a Multics system, you will see a prompt like this:
Multics MR12.6d: Gold Hill Multics (Channel d.h001) Load = 5.0 out of 90.0 units: users = 5, 03/22/16 1517.4 pst Tue
You can type "help" here, in which you'll get a list of the most common commands available here:
help Examples of correct login: login Person_name projectid enterp Special_name projectid enter Special_name projectid Upper and lower case letters are different. Check any typing conventions for your terminal. Contact your administrator for more help. Please try to login again or type "help" for instructions.
If you have an account on the system, you should use the "login" command to log in. For anonymous access, you can use either the "enter" or "enterp" commands. There are other options available at this prompt, including the "ttp" command, which will display your current "terminal type" or set your terminal type.
Logging into an Existing Account
To login, enter a command such as:
You will be prompted for a the password for the "personid" Repair. If the password is correct, you will be logged in as "Repair" in whatever project is the default project for "Repair".
You can use "l" as a shortcut for "login".
For the first login to a cold-booted (or QuickStart) Multics system, the only interactive login accounts available are Repair.SysAdmin and Repair.SysDaemon. The password for the "Repair" personid is "repair". The first time you login as "Repair" you will be required to change the password.
l Repair Password: You must use the -change_password option to change your password. Please try to login again or type "help" for instructions.
To change your password during login, use either the -change_password or -cpw control argument to the login command. You will be prompted for the old password, and (twice) for the new password.
l Repair -cpw Password: New Password: New Password Again: Password changed. You are protected from preemption. Repair.SysAdmin logged in 03/22/16 1648.8 pst Tue from ASCII terminal "none". New messages in message_of_the_day: Welcome to the Multics System. print_motd: Created >user_dir_dir>SysAdmin>Repair>Repair.value. r 16:48 1.056 31
Note that the default project for Repair is SysAdmin. Repair is also registered on the SysDaemon project. You should refrain from logging in as Repair.SysDaemon, as users on the SysDaemon project have read/write access to virtually everything and can very easily damage the file system in ways that make it unbootable. Of course, there may be times when you need to login to this project.
If you don't want to login with the default project, you can specify another project during login:
Multics MR12.6d: Gold Hill Multics (Channel d.h000) Load = 5.0 out of 90.0 units: users = 5, 03/22/16 1652.1 pst Tue l Repair SysDaemon Password: You are protected from preemption. Repair.SysDaemon logged in 03/22/16 1652.2 pst Tue from ASCII terminal "none". New messages in message_of_the_day: Welcome to the Multics System. print_motd: Created >user_dir_dir>SysDaemon>Repair>Repair.value. r 16:52 1.253 21
Note that upon login, Multics will display a "ready message", indicating that it is ready for you to enter commands:
r 16:52 1.253 21
Logging in as an Anonymous User
if you don't have an account on a Multics system, the administrator may have enabled Guest logins. There are two kinds of Guest logins: those that require a password and those that don't. We will explore those without passwords here.
To login to Multics on the Guest project as an anonymous user, use the "enter" or "e" login command:
Multics MR12.6d: Installation and location (Channel d.h000) Load = 5.0 out of 90.0 units: users = 5, 03/22/16 1736.5 pst Tue enter Swenson Guest You are protected from preemption until 17:36. Anonymous user Swenson.Guest logged in 03/22/16 1736.6 pst Tue from ASCII terminal "none". New messages in message_of_the_day: Welcome to the Multics System. print_motd: Entry not found. Attempting to update message-of-the-day information in default value segment. r 17:36 1.151 20
You may use any Personid you like. I used my real Personid, above, but I really am logged in anonymously. You can verify this with the "who" command:
who Multics MR12.6d, load 6.0/90.0; 6 users, 1 interactive, 5 daemons. Absentee users 0/3 anonymous.Guest r 17:40 0.079 0
In this case, you will not have write access to your home directory (which will be >udd>Guest). If you wish to create files, you will have to use your process directory. Your process directory will have a pathname like:
You can use the command/active function "process_dir" or "pd" to determine your process directory. To change directories to your process directory, for example, use this command:
cwd [pd] r 17:43 0.113 2 pwd >process_dir_dir>!BLLDlXdBBBBBBB r 17:43 0.069 0
You will have write access to your process directory, where you can create, edit, etc. files. Note, however, that your process directory will be deleted upon logout. If you wish to have permanent file storage, either use a non-Guest account or ask your system administrator (which may be you!) to create a writeable home directory for Guest anonymous logins. See Giving Guest Users a Writeable Home Directory.
If you are like most of us, you haven't used Multics in decades. :-) Or you might never have used Multics before. Probably the most important few things to learn immediately are these:
- To change working directories, use the "change_wdir" or "cwd" command. Do NOT use "cd", which, on Multics, is "create_directory".
- The pathname separator is ">" rather than "/" or "\".
- "ls -l", which on Linux gives you a "long" listing, will list only "links". You probably want "ls -a" which shows you segments, directories, multi-segment files (MSFs), and links.
When you first login, you will find yourself in your home directory. Your home directory is located under your project directory. And the project directory is located under the directory >user_dir_dir (or >udd). Your home directory will therefore generally have this form:
If user Personid is Swenson and your Project is SysAdmin, your home directory will (by default) be:
If you want to change directories to your project directory, you can use relative or absolute pathnames. Using absolute pathnames, you would type:
If your working directory is currently >udd>SysAdmin>Swenson, and you wish to change to the parent (Project) directory, you can use relative paths:
To create a directory, use the "create_dir" or "cd" command. For example:
Listing the Contents of a Directory
To list the contents of a directory, use the "ls" command. Note, however, that Multics, unlike most systems these days, will "ls" exactly what you ask it to. If you just type:
it will dutifully show you:
ls >udd>SysAdmin Directories = 1. sma SysAdmin sa r 18:57 0.110 0
To list the contents of the >udd>SysAdmin directory, type:
However, this is probably still not quite what you want, since typing that command will result in:
ls >udd>SysAdmin>** Segs=0;Msfs=0;Dmfs=0;Dirs=15;Links=0. r 18:58 0.225 1
This is because you didn't tell the "ls" command what you wanted to list, and it, by default, only shows you segments, and if there are none, gives you the totals of all the various "entry" types.
To see everything under the >udd>SysAdmin directory, use this:
ls >udd>SysAdmin>** -a Directories = 4. sma admin a sma library lib l sma Repair sma SA1 sa1 r 18:01 0.215 0
This shows you that under this directory, there only exist directories.
Each directory entry name (e.g. segments, directories, MSFs, and links) can have 1 or more names. The first name is typically called the "primary name" and the other names are called "addnames". In the example, above, you can see that the "admin" directory has an "addname" or "a" and the "library" directory has two addnames: "lib" and "l".
To add a new name to an entry, use the "add_name" or "an" command. For example:
cd foo r 18:03 0.041 1 an foo bar r 18:03 0.077 3 ls foo Directories = 1. sma foo bar r 18:03 0.065 0
When get a new process, either by logging in or executing the "new_proc" command, by default, Multics will look for and execute your start up script, called start_up.ec. The "ec" stands for "exec_com", which is the scripting language available on Multics. Process initialization looks for this script in your home directory. If it doesn't find one there, it looks in your project directory, and if it doesn't find one there looks in >system_control_1>start_up.ec.
If it finds a start_up.ec, it executes it, passing it two parameters. The first parameter is either "login" or "new_proc". While many start_up.ec scripts ignore their parameters, these can be used to differentiate between the two ways you can get a new process. The second parameter is either "interactive" or "absentee". Interactive processes are those attached to a terminal and initially created through a login. Absentee processes are background processes that you can schedule. You do not need to be logged in interactively in order to have absentee processes running on your behalf.
Unless you or someone else has created a start_up.ec for you in your home or project directory, the system will execute the start_up.ec found in >system_control_1>start_up.ec. The contents of this segment are shown below:
pr >sc1>start_up.ec start_up.ec 03/22/16 1812.0 pst Tue & ****************************************************** & * * & * Copyright, (C) Honeywell Bull Inc., 1987 * & * * & * Copyright (c) 1972 by Massachusetts Institute of * & * Technology and Honeywell Information Systems, Inc. * & * * & ****************************************************** & & & HISTORY COMMENTS: & 1) change(87-08-12,GDixon), approve(88-08-15,MCR7969), & audit(88-08-03,Lippard), install(88-08-29,MR12.2-1093): & Change to call print_motd instead of using the print command to print & the message of the day. (phx15921) & END HISTORY COMMENTS & & & start_up.ec -- default start_up for >sc1 & this exec com just prints the motd to duplicate the old behavior of & process_overseer_. & & It is executed by all users (with standard process overseers) who & lack start_up.ec in their homedir and project dir. & &command_line off &goto &ec_name &label start_up &if [equal &1 login] &then print_motd &quit r 18:12 0.449 0
You will notice that this start_up.ec uses "&1" to access the first parameter ("login" or "new_proc"). In this case, it only prints the message of the day ("print_motd" or "pmotd") upon login, and not for new_proc.
The second thing you may notice is the contruction:
Any exec_com can have multiple "addnames" on it. This &goto command will transfer control to the "&label" whose name is equal to the name used to invoke the exec_com. This allows you to group multiple exec_com scripts into one segment and branch to the correct one depending on which name was used to invoke it. Of course, to make this work, you must add names to the segment for each of these "entrypoints".
For info on exec_com syntax and functionality, type "help exec_com" or see the documentation on "exec_com" in the "Commands and Active Functions" manual, AG92.
A More Useful Start_up.ec
Below, you will find another example of a start_up.ec.
&version 2 &trace &command off &- &- Enable abbreviations in commands &- abbrev &- &- Add >doc>privileged to your info search paths &- asp info >doc>privileged &- &- Make C compiler accessible/usable &- asr >sl3p>c_compiler>e asp info >sl3p>c_compiler>info &- &- For interactive logins: &- &if [equal &2 interactive] &then &do &- &- Set terminal type; &- stty -ttp vt102_PL50 &- &- And invoke video system. &- wdc invoke &- &- On systems with several users registered: &- - Accept interactive messages &- accept_messages &- &- - Check for mail/messages &- have_mail &- &end &- &quit
The comments in the above start_up.ec explain what the corresponding commands do. Note that this exec_com starts with "&version 2". This enables the "new" (version 2) functionality of exec_com. As you can guess, there was a more limited "version 1" before the "new" version. (Yes, I mean "new" in the 1980s). See the documentation on "exec_com" for details.
When you login, the command processor (command_processor_$command_processor_) evaluates command as you type them on your terminal. You can enable an alternate command processor, abbrev$abbrev_processor that expands abbreviations in your command lines before passing them to command_processor_$command_processor_. You enable "abbrevs" by typing the "abbrev" command, or, more practically, by putting the "abbrev" command in your start_up.ec.
To add an abbrev, you use a command like the following:
.ab cd format_line "You really don't want to type 'cd' do you?"
This defines an abbrev called "cd" that, when typed at the beginning of the line (".ab" rather than ".a") will expand to the command:
format_line "You really don't want to type 'cd' do you?"
format_line is a command and active function that will format a string (with substitutions) and display it on the terminal (or return it as a string when invoked as an active function).
To list your abbrevs, use the ".l" command:
To execute a command without expanding abbrevs, preface the command with ". " (that is, a "." followed by a SPACE).
For more information on abbrev, type "help abbrev"
You have multiple editors available to choose from on Multics. Here is a list of a few:
Emacs is, well, Emacs. If you don't know what Emacs is, or how to use it, you are one very sad individual. Of course, the Emacs that you probably know and love is a lot more feature rich than the one on Multics. But yes, Emacs is written in MacLisp and runs quite well.
You invoke emacs with the "emacs" command, and exit it with the Control-x Control-c key binding. For help with emacs, type "help emacs" (outside of emacs). You can type Escape-x help <CR> inside emacs for some brief help and pointers to more documentation. Of course, you can also learn lots more about Emacs by reading the various Multics Emacs manuals.
If you haven't set your terminal type (see "help stty") then emacs will prompt you for a terminal type upon startup. Assuming you are connected to Multics via telnet, answer "vt102" if you haven't set up any better terminal types.
I have an abbrev I use to invoke emacs:
.ab emacs emacs -ttp vt102 -ll 132 -pl 50
This tells emacs to use the "vt102" terminal type and to set the line length to 132 characters and the page length to 50 characters.
You can also invoke emacs after first invoking the "video system" ("wdc invoke").
QEDX is a simple non-WYSIWYG editor. Do a "help qedx" for help or see the documentation on QEDX in the "Commands and Active Functions" manual, AG92.
As a simple example, to create a new file with the contents:
&version 2 &trace &command off &print hello there &quit
You could do the following:
qedx a &version 2 &trace &command off &print hello there &quit \f w foo.ec q
The "a" command puts you in append mode. The following lines up to the "\f" are the desired contents of the segment. The "\f" command ends input. The "w" command saves the contents of the edit buffer to a segment whose name is specified as the argument to the "w" command. And the "q" command quits qedx.
Other useful commands are:
- i - insert mode (inserts above the current position in the edit buffer)
- a - append mode (inserts below the current position in the edit buffer)
- s/XXX/YYY/ - substitutes YYY for XXX in the current line
- r - reads in a segment
This editor is like qedx. Do a "help edm" for details.
I'm not going to touch this with a 10-foot pole. Only crazy hackers use Teco. (By the way, the first Emacs i ever used was written in Teco. And you wrote customizations to Emacs in Teco. I learned Teco so that I could customize Emacs. Thank goodness Emacs was rewritten in MacLisp.
If you really want to use Teco, do a "help teco" or see the documentation on this editor in the manuals.
All the commands and active functions, as well as many (most/) of the subroutines are documented online in what are called "info segments". These are text files so you can read them into Emacs or display their contents with the "pr" command. However, a much more useful command is "help", which will look for an info segment of the specified name (e.g. "help abbrev") and prompt you to display the various parts of the documentation. Try it.
If you are trying to locate an info segment, but don't know its name, try the "list_help" or "lh" command. This will display the names of all the info segments whose names include the substring you provide as a parameter to "lh".
Command Levels and Errors
When you first login, the system responds with a "ready" message. This "ready" message looks like this, by default:
r 18:54 2.000 90
To find out how to customize it, type "help general_ready" or "help gr". You can also find more info with "lh ready".
When you get an error, a "condition" is signaled and a recursive command level is entered. The ready message shows this in the following way:
r 18:56 0.097 0 level 2
The number after "level" is the depth of the command levels. You can also get to a new command level, interrupting the executing program, by pressing the Control-c command. Doing so causes Multics to display:
QUIT r 18:57 0.068 0 level 3
To throw away the current program execution (stack frames), you can use the "release" or "rl" command. To release all recursive command levels and return to level 1, you can type "rl -all".
If you have interrupted a program (with Control-C) and wish to resume it, use the "start" or "sr" command.
As an example of a signaled condition causing a recursive command level, consider the following PL/1 program:
pr foo.pl1 foo.pl1 03/22/16 1900.7 pst Tue foo: procedure options(variable); dcl a fixed bin; dcl b fixed bin; a = 10; b = a/0; end foo; r 19:00 0.148 0
If you compile this program:
pl1 foo.pl1 PL/1 33e r 19:01 0.272 13
and run it:
foo Error: Attempt to divide by zero at >user_dir_dir>SysAdmin>Repair>foo|11 (line 7) (while in operator divide_fx1) system handler for error returns to command level r 19:01 0.168 0 level 2
you will get a recursive command level.
If you try to "start" this command,
sr Error: Attempt to divide by zero at >user_dir_dir>SysAdmin>Repair>foo|11 (line \c 7) (while in operator divide_fx1) system handler for error returns to command level r 19:02 0.204 0 level 2
You will not be able to and will be returned to the current command level. To release this command level, do:
rl r 19:02 0.022 0
What To Do If You Get an Unexpected Error
If you do get a recursive command level due to an error that you don't think is your own fault and can't otherwise explain -- especially if you think it is due to an emulator error -- you can invoke the "probe" command, and within "probe", the "stack" ("sk") command to get a bit more info as to the cause of the error. See below:
foo Error: Attempt to divide by zero at >user_dir_dir>SysAdmin>Repair>foo|11 (line \c 7) (while in operator divide_fx1) system handler for error returns to command level r 14:57 0.250 0 level 2 probe Condition zerodivide raised at line 7 of foo (level 4). sk 11 command_processor_ 10 release_stack 9 unclaimed_signal 8 wall 7 any_other.2 6 wall error 5 any_other.2 4 foo (line 7) zerodivide 3 command_processor_ 2 listen_ 1 initialize_process_
As you can see, the zerodivide condition was raised as a result of the code at line 7 in the "foo" executable, which was invoked from the command_processor_. You can exit out of "probe" with the "q" command or hunt around for more info.
You can also use the "trace_stack" ("ts") command to trace the stack after an exception. See below for example output:
ts system handler for error returns to command level Machine conditions not available. 234|5160 default_error_handler_$wall|2671 (bound_error_handlers_|2671) Cannot get line number in default_error_handler_ 2671 000622700100 tsx0 pr0|622 call_ext_out_desc Argument list pointer: 234|5136 No arguments. 234|5060 initialize_process_$any_other.2|426 (bound_process_init_|426) Cannot get line number in initialize_process_ 426 000617700100 tsx0 pr0|617 call_ent_var Argument list pointer: 234|5006 ARG 1: 234|4160 stack_4|4160 ARG 2: "zerodivide" ARG 3: 77777|1 null pointer|1 ARG 4: 77777|1 null pointer|1 ARG 5: "0"b 234|4520 signal_$signal_|1467 (bound_library_1_|11205) Cannot get line number in signal_ 11205 000616700100 tsx0 pr0|616 call_ent_var_desc Argument list pointer: 234|4246 Warning: arg 1 packed mismatch: 0 supplied, 1 expected. ARG 1: "zerodivide" ARG 2: 234|4160 stack_4|4160 ARG 3: 77777|1 null pointer|1 ARG 4: 77777|1 null pointer|1 234|4100 return_to_ring_0_|0 Bad argument pointer. on "cleanup" call restart_fault|1 Attempt to divide by zero at >user_dir_dir>SysAdmin>Repair>foo|11 (line 7) (while in operator divide_fx1) (zerodivide condition) foo.pl1 (line 7): b = a/0; 11 001262700100 tsx0 pr0|1262 divide_fx1 Machine registers at time of fault pr0 (ap) 234|3760 stack_4|3760 pr1 (ab) 234|3734 stack_4|3734 pr2 (bp) 374|17 foo|17 pr3 (bb) 234|3640 stack_4|3640 pr4 (lp) 247|54376 !BBBKKPFblfpMpH.area.linker|54376 (linkage|0 for \c foo) pr5 (lb) 247|4052 !BBBKKPFblfpMpH.area.linker|4052 (internal stati \cc|0 for init_vol_header_) pr6 (sp) 234|3640 stack_4|3640 pr7 (sb) 234|0 stack_4|0 x0 12 x1 0 x2 66 x3 26724 x4 21 x5 2 x6 0 x7 26362 a 000000000000 q 000050000000 e 0 Timer reg - 41477, Ring alarm reg - 0 SCU Data: 4210 400257050040 000000000035 400234000000 000000000000 026731400200 003776000000 000016507100 200000371502 Divide Check Fault (35) By: 257|26731 pl1_operators_|6421 (bound_library_wired_|26731) Referencing: 234|3776 stack_4|3776 On: cpu a (#0) Indicators: zero, ^bar APU Status: sd-on, pt-on, fap Instructions: 4216 0 00016 5071 00 dvf pr0|16 4217 2 00000 3715 02 epp5 pr2|0,qu Time stored: 03/23/16 1457.1 pst Wed (147262037442100574) Ring: 4 234|3640 foo$foo|11 (line 7) in operator divide_fx1 foo.pl1 (line 7): b = a/0; 11 001262700100 tsx0 pr0|1262 divide_fx1 Argument list pointer: 234|3206 Command name: foo No arguments. 234|2700 command_processor_$command_processor_|2101 (bound_multics_bce_|2101 \c) Cannot get line number in command_processor_ 2101 000623700100 tsx0 pr0|623 call_ext_out Argument list pointer: 234|2564 ARG 1: 234|2640 stack_4|2640 ARG 2: 4 ARG 3: 0 on "command_abort_" call command_processor_|1140 (bound_multics_bce_ \c|1140) 234|2400 listen_$listen_|554 (bound_command_loop_|34522) Cannot get line number in listen_ 34522 000623700100 tsx0 pr0|623 call_ext_out Argument list pointer: 234|2242 ARG 1: "exec_com >user_dir_dir>SysAdmin>Repair>start_up.ec new_proc \cinteractive" on "cleanup" call listen_|271 (bound_command_loop_|34237) 234|2000 initialize_process_$initialize_process_|704 (bound_process_init_|70 \c4) Cannot get line number in initialize_process_ 704 000616700100 tsx0 pr0|616 call_ent_var_desc Argument list pointer: 234|0 No arguments. on "any_other" call initialize_process_|411 (bound_process_init_|411 \c) End of trace. r 14:58 2.000 4 level 2
Any information that you're willing to post to the relevant mailing list to help us find and fix emulator bugs would be greatly appreciated. Use the firstname.lastname@example.org mailing list to report such errors.
In order to queue a segment for printing, use the "enter_output_request" ("eor") command. For help on this command, type "help eor". Segments queued for printing will be printed when the printer becomes idle, as long as the printer daemon is running. After a cold boot of Multics, or when running the QuickStart, there is one printer daemon configured for the device "prta". However, unless you specifically start the daemon, no printer requests will be served. To start the printer daemon, you can use the Initializer command:
This will send the appropriate commands to the IO.SysDaemon (prta) daemon to begin processing requests from the queue.
Note: the "old" way to queue a segment for printing was to use the "dprint" ("dp") command. While this command still works, it has been functionally replaced with the preferred "enter_output_request" command.
DPS8M Specific Info
The DPS8M emulator supports the printer devices (e.g. prta) creating files on the host system, in the directory where you started the emulator (e.g. in the QuickStart_MR12.6d directory). The file will have a filename following the pattern: <device-name>.spool.<request-id>.<personid>.<projectid>.<tag>.<random-string>. For example:
The emulator doesn't actually print the file for you, it just creates it. You are free to "print" it any way you'd like. One option is to use the "enscript" program to convert the "lineprinter" output to a PDF, and then use your operating system facilities for printing the PDF.