|
|
1.1 ! root 1: MiNT is Not TOS: A Multitasking Operating System Extension for the Atari ST ! 2: ! 3: ! 4: ! 5: Copyright 1990,1991,1992 Eric R. Smith. All rights reserved. See the file ! 6: ! 7: "copying" for conditions of redistribution. ! 8: ! 9: ! 10: ! 11: WARNING: This program does some very low level things to your computer. ! 12: ! 13: MiNT works well on my machine, and I trust my data to it. But ! 14: ! 15: then, I make regular backups, so even if a horrible bug in MiNT that ! 16: ! 17: I haven't found yet trashes my hard drive, I won't lose much. You'll ! 18: ! 19: have to decide for yourself about trusting your data to MiNT. I would ! 20: ! 21: certainly recommend regular backups in any event. ! 22: ! 23: ! 24: ! 25: MiNT COMES WITH ABSOLUTELY NO WARRANTY, NOR WILL I BE LIABLE FOR ANY ! 26: ! 27: DAMAGES INCURRED FROM THE USE OF IT. USE ENTIRELY AT YOUR OWN RISK!!! ! 28: ! 29: ! 30: ! 31: Introduction ! 32: ! 33: ! 34: ! 35: MiNT is an extension of (and eventually, I hope, a replacement for) TOS. ! 36: ! 37: It provides extra services such as multitasking and pipes. If you don't ! 38: ! 39: know what those terms mean, MiNT is probably not for you -- at this stage, ! 40: ! 41: MiNT is still very incomplete and should be regarded as "experimental". ! 42: ! 43: ! 44: ! 45: MiNT will run a great number of ("most", I hope) TOS programs, including ! 46: ! 47: GEM. As the name says, though, MiNT is not TOS, so it can't be expected to ! 48: ! 49: run all TOS programs, or even all well-behaved TOS programs (although I hope ! 50: ! 51: that it will run "almost all" of the latter!). There are two classes of ! 52: ! 53: incompatibilities with TOS: bugs and features. Bugs are undoubtedly ! 54: ! 55: present; if you find any please report them to me. There are also some ! 56: ! 57: features of MiNT that may cause incompatibilites. Most of these are listed ! 58: ! 59: in the accompanying "features" file. ! 60: ! 61: ! 62: ! 63: MiNT tries to emulate TOS 1.4 very closely. If you have TOS 1.0 or 1.2, ! 64: ! 65: you may think you can use MiNT instead of buying TOS 1.4. This isn't really ! 66: ! 67: a very good idea, because MiNT calls TOS, and so having the newer version ! 68: ! 69: of TOS will really speed things up. Besides, the GEM that comes with TOS 1.4 ! 70: ! 71: is a lot better than the old GEM. ! 72: ! 73: ! 74: ! 75: ! 76: ! 77: Using MiNT ! 78: ! 79: ! 80: ! 81: MiNT can be started from an AUTO folder, by setting it as a BOOT program ! 82: ! 83: on the desktop (TOS 1.4 or higher only) or by running it. I prefer the AUTO ! 84: ! 85: folder way myself. ! 86: ! 87: ! 88: ! 89: If you put it in an AUTO folder, it should be the last thing in the folder ! 90: ! 91: (since any later programs in the folder will run only after MiNT is finished, ! 92: ! 93: and MiNT should never finish). MiNT will try to run a program called ! 94: ! 95: "init.prg" in the current directory (which is the root directory if MiNT ! 96: ! 97: was started from an AUTO folder). If this program isn't found, MiNT will ! 98: ! 99: boot up GEM. You can change the name of the initial program to run ! 100: ! 101: via the "mint.cnf" file (see below). ! 102: ! 103: ! 104: ! 105: Once MiNT is running, the computer should behave just as it does under TOS, ! 106: ! 107: except that some new drives (U, Q, V, and X) will be available, background ! 108: ! 109: processes can be started, and programs can use the new features of MiNT. ! 110: ! 111: ! 112: ! 113: MiNT can be asked to provide a trace of the currently executing programs. ! 114: ! 115: Hitting CTRL-ALT-F1 increases the debugging level; hitting CTRL-ALT-F2 ! 116: ! 117: decreases it, and hitting CTRL-ALT-F3 changes where the debugging output ! 118: ! 119: goes; pressing it once changes it from the screen to the printer, pressing ! 120: ! 121: it again changes it to the RS232 port, pressing a third time sends debugging ! 122: ! 123: output to the MIDI port. Pressing CTRL-ALT-F4 resets output to the screen. ! 124: ! 125: This feature was designed to aid in debugging MiNT itself, but can also be ! 126: ! 127: useful in finding problems with user programs. Debugging level 0 (the normal) ! 128: ! 129: prints messages only when something goes seriously wrong inside of MiNT itself. ! 130: ! 131: Debugging level 1 prints a message when any system call fails. Debugging level ! 132: ! 133: 2 provides a (sickeningly) exhaustive trace of what's going on in the system. ! 134: ! 135: ! 136: ! 137: CTRL-ALT-F5 shows what memory is being used in the system ! 138: ! 139: CTRL-ALT-F6 prints a list of all processes in the system ! 140: ! 141: CTRL-ALT-DEL provides a (warm) boot, as in TOS >= 1.4, and ! 142: ! 143: CTRL-ALT-SHIFT-DEL provides a cold boot. ! 144: ! 145: ! 146: ! 147: Some other keys are recognized by MiNT if the process is doing I/O in ! 148: ! 149: "cooked" mode: ! 150: ! 151: ^C (CTRL-C): interrupt running program with signal SIGINT. This (usually) ! 152: ! 153: will kill the process, unless it has made arrangements to catch it. ! 154: ! 155: Note that ^C takes effect immediately under MiNT, whereas under TOS ! 156: ! 157: it only takes effect when the process reads or writes. ! 158: ! 159: ^\: send a QUIT signal to a process; usually the same end result as ^C, but ! 160: ! 161: it is guaranteed to kill a TOS program (only MiNT specific programs ! 162: ! 163: know how to catch it). Use with caution. ! 164: ! 165: ^Z: suspend the current process ! 166: ! 167: ! 168: ! 169: These keys do *not* have any effect on processes operating in "raw" mode, ! 170: ! 171: such as editors. However, you can force these to work even on such programs ! 172: ! 173: by holding down the ALT key as well, i.e. CTRL-ALT-Z will always suspend ! 174: ! 175: the process. You should use caution when doing this, since some programs ! 176: ! 177: will function incorrectly and/or lose data if interrupted when they ! 178: ! 179: aren't expecting it. ! 180: ! 181: ! 182: ! 183: ! 184: ! 185: The MiNT Configuration File ! 186: ! 187: ! 188: ! 189: If MiNT finds a file called "mint.cnf" in the directory that it was ! 190: ! 191: started from, it will read some configuration information from it. This ! 192: ! 193: file is an ordinary ASCII text file; it can be created with any editor ! 194: ! 195: that will produce plain ASCII files (if you're using a fancy word ! 196: ! 197: processor, make sure you save the file as "plain ASCII text" or ! 198: ! 199: "unformatted text" or whatever). ! 200: ! 201: ! 202: ! 203: The commands in mint.cnf are placed one per line, and may be of the following ! 204: ! 205: forms: ! 206: ! 207: ! 208: ! 209: INIT=d:\foo\bar.prg ! 210: ! 211: This specifies the drive and full path name to the program you ! 212: ! 213: want MiNT to run at boot up time. The default is try ".\init.prg", ! 214: ! 215: if that file exists, otherwise to run the GEM desktop. ! 216: ! 217: HARDSCROLL=25 ! 218: ! 219: This specifies that hardware scrolling should be used for ! 220: ! 221: the u:\dev\fasttext text accelerator. This dramatically speeds ! 222: ! 223: up text operations, but may interfere with GEM and graphics ! 224: ! 225: programs. Put this line *before* any use of u:\dev\fasttext. ! 226: ! 227: CON=u:\dev\fasttext ! 228: ! 229: Specifies the use of MiNT's built in text accelerator instead ! 230: ! 231: of the normal BIOS console. This speeds up text output quite ! 232: ! 233: a bit (more than 300%) but may not be completely compatible; ! 234: ! 235: in particular, the escape codes for setting foreground/background ! 236: ! 237: character colors are not supported. ! 238: ! 239: PRN=d:\foo\bar ! 240: ! 241: Specifies a file that should be used for all printer output. ! 242: ! 243: (The default is u:\dev\centr, which is the device corresponding ! 244: ! 245: to the centronics port.) ! 246: ! 247: ! 248: ! 249: cd d:\foo ! 250: ! 251: Change the current drive and directory. This isn't terribly ! 252: ! 253: useful, unless your initial program (see above) expects to run ! 254: ! 255: with some particular directory as the current one. ! 256: ! 257: ! 258: ! 259: exec d:\bin\prog.prg arg1 arg2 ... ! 260: ! 261: Execute a program, with some arguments. The full path name and ! 262: ! 263: extension (.prg, .tos, .ttp, or whatever) of the program to ! 264: ! 265: execute must be given. ! 266: ! 267: ! 268: ! 269: ren d:\nm1 d:\nm2 ! 270: ! 271: Rename a file or directory. This is useful mainly on the pseudo-drive ! 272: ! 273: v:, which refers to devices. For example, the RS232 port on the ST ! 274: ! 275: is called "v:\modem1". Earlier versions of MiNT called this ! 276: ! 277: "v:\rs232", so if your programs care about this you might want ! 278: ! 279: to put "ren v:\modem1 v:\rs232" to maintain compatibility. ! 280: ! 281: Similarly, if your software has been ported from Unix and expects ! 282: ! 283: terminals to be called "tty*", then you might want to put ! 284: ! 285: "ren v:\modem1 v:\tty1" instead. ! 286: ! 287: ! 288: ! 289: setenv FOO BAR ! 290: ! 291: Set the environment variable FOO to the value BAR. NOTE: If any ! 292: ! 293: setenv commands are given in mint.cnf, an entirely new environment ! 294: ! 295: is constructed; this means that any environment variables set by ! 296: ! 297: a program in the AUTO folder will be ignored by programs run under ! 298: ! 299: MiNT. This allows you to have two default environments, one for ! 300: ! 301: running under MiNT set in mint.cnf, and one for normal TOS set ! 302: ! 303: by an AUTO folder program. ! 304: ! 305: ! 306: ! 307: sln d:\foo\bar u:\baz ! 308: ! 309: Create a symbolic link called "u:\baz" for the file (or directory) ! 310: ! 311: d:\foo\bar. Only drive u: supports symbolic links, so the second ! 312: ! 313: name *must* be on drive u:; the first name can be anything. ! 314: ! 315: A symbolic link is just an alias or nickname for a file; if the ! 316: ! 317: sample line is included in your mint.cnf file, then references ! 318: ! 319: to u:\baz are automatically translated by the kernel so that ! 320: ! 321: they "really" refer to d:\foo\bar. If d:\foo\bar is actually ! 322: ! 323: a subdirectory, with the file "frob.txt" in it, then that ! 324: ! 325: file can be accessed either through the name "d:\foo\bar\frob.txt" ! 326: ! 327: or "u:\baz\frob.txt". ! 328: ! 329: ! 330: ! 331: Symbolic links are often used to tell programs where to look for ! 332: ! 333: files; in this respect they're somewhat like environment variables. ! 334: ! 335: Some "standard" links are: ! 336: ! 337: u:\bin directory to find programs in ! 338: ! 339: u:\etc directory to find certain general ! 340: ! 341: configuration files (e.g. passwd and termcap) ! 342: ! 343: u:\local directory to find node-specific files in ! 344: ! 345: (for networked systems) ! 346: ! 347: u:\lib directory to find C libraries in ! 348: ! 349: u:\include directory to find C header files in ! 350: ! 351: You can use whatever of these are convenient, or add some others ! 352: ! 353: of your own. ! 354: ! 355: ! 356: ! 357: ! 358: ! 359: Pseudo Drives ! 360: ! 361: ! 362: ! 363: MiNT provides some fake "disk drives"; if the contents of these drives ! 364: ! 365: are listed, various "files" are shown. These "files" are not necessarily ! 366: ! 367: real files, but may represent other objects such as executing programs or ! 368: ! 369: regions of memory. ! 370: ! 371: ! 372: ! 373: The most important of these pseudo drives is drive U:. This is a ! 374: ! 375: "unified" file system that has all other drives as subdirectories. ! 376: ! 377: For example, U:\A\FOO\BAR is another name for the file A:\FOO\BAR. ! 378: ! 379: Symbolic links can also be created from drive U: to other drives; ! 380: ! 381: e.g. if the line ! 382: ! 383: sln U:\ETC C:\UNIX\ETC ! 384: ! 385: appears in mint.cnf, then the file U:\ETC\TERMCAP will be another ! 386: ! 387: name for the file C:\UNIX\ETC\TERMCAP, and so on. ! 388: ! 389: ! 390: ! 391: Finally, drive U: contains some special subdirectories, as follows: ! 392: ! 393: ! 394: ! 395: U:\PIPE contains files which are FIFO queues (e.g. pipes). All files ! 396: ! 397: created in this directory are temporary; when the last program using a FIFO ! 398: ! 399: closes it, it is erased. Normally, U:\PIPE will be empty, but it will ! 400: ! 401: have items on it when you're running a window manager, print spooler, ! 402: ! 403: or similar program that uses FIFOs or pseudo-ttys for communication. ! 404: ! 405: ! 406: ! 407: U:\DEV contains files which correspond to the BIOS devices; this allows ! 408: ! 409: you to access these devices from within programs. For example, saving an ! 410: ! 411: ASCII text file to "U:\DEV:\PRN" should cause it to be printed on your printer. ! 412: ! 413: Of course, this will work *only* with ASCII data, so don't expect to get ! 414: ! 415: anything meaningful printed if you try to save your spreadsheet to "U\DEV\PRN"! ! 416: ! 417: The following devices are available: ! 418: ! 419: CENTR: the centronics printer port ! 420: ! 421: MODEM1: the RS232 serial port ! 422: ! 423: MIDI: midi port ! 424: ! 425: KBD: intelligent keyboard controller ! 426: ! 427: PRN: printer device (not necessarily the real printer if redirected) ! 428: ! 429: AUX: auxiliary terminal (usually, but not always, the rs232 port) ! 430: ! 431: CON: current control terminal (NOT necessarily the keyboard/screen!) ! 432: ! 433: TTY: same as above ! 434: ! 435: STDIN: current file handle 0 (standard input) ! 436: ! 437: STDOUT: current file handle 1 (standard output) ! 438: ! 439: STDERR: current file handle 2 (standard error) ! 440: ! 441: CONSOLE: (physical console) the keyboard/screen ! 442: ! 443: FASTTEXT: an alternate, faster text device for the console screen ! 444: ! 445: MOUSE: a Sun compatible mouse device. Don't use this directly; ! 446: ! 447: use the AES/VDI functions instead. ! 448: ! 449: NULL: a null device (like Unix's /dev/null) ! 450: ! 451: ! 452: ! 453: The "STD*" file handles are useful for providing I/O redirection to programs ! 454: ! 455: that normally require file names on the command line; for example, if you ! 456: ! 457: want to run such a program in a pipeline. ! 458: ! 459: ! 460: ! 461: U:\PROC has special files that represent all currently executing ! 462: ! 463: processes, such as whether they're running, ready, or waiting, their process ! 464: ! 465: i.d. numbers, and the amount of memory they've taken. Deleting one of the ! 466: ! 467: "files" kills the corresponding process. (Killing MiNT is impossible; ! 468: ! 469: killing GEM is a very bad idea). The "files" will have names like "INIT.001"; ! 470: ! 471: this means that the process name is "INIT" (presumably because it was started ! 472: ! 473: from a file like "INIT.PRG"), and its process i.d. is 1. You can rename ! 474: ! 475: processes just as if they were files, except that any extension you give is ! 476: ! 477: always replaced with the process i.d. (e.g. if you rename INIT.001 to FOO.BAR, ! 478: ! 479: it will really become FOO.001). The size of a process is the amount of memory ! 480: ! 481: that is allocated to it. Its date/time stamp indicates when it started ! 482: ! 483: executing. A process' current state is reflected by its attribute bits; most ! 484: ! 485: of these are not visible from the desktop, alas, but here are the combinations ! 486: ! 487: and their meanings: ! 488: ! 489: attribute process state ! 490: ! 491: 0x00 currently running ! 492: ! 493: 0x01 ready to run ! 494: ! 495: 0x20 waiting for an event (e.g. for a child to finish) ! 496: ! 497: 0x21 waiting for I/O ! 498: ! 499: 0x22 zombie (exited, but parent doesn't know yet) ! 500: ! 501: 0x02 terminated and resident ! 502: ! 503: 0x24 stopped by a signal ! 504: ! 505: Deleting a "file" in U:\PROC will send a SIGTERM signal to the corresponding ! 506: ! 507: process, which will usually result in that process being terminated. It ! 508: ! 509: is not possible to delete processes which are terminated and resident, ! 510: ! 511: or zombie processes. ! 512: ! 513: ! 514: ! 515: U:\SHM is a place for shared memory. A program may create a file in U:\SHM ! 516: ! 517: and attach a block of memory to it. Thereafter, other programs may open ! 518: ! 519: that file and use the memory. This provides a fast way to transfer large ! 520: ! 521: amounts of data between processes. ! 522: ! 523: ! 524: ! 525: Other pseudo drives that are available are Q:, V:, and X:. These are just ! 526: ! 527: aliases for U:\PIPE, U:\DEV, and U:\PROC, respectively, and exist for ! 528: ! 529: backwards compatibility. Don't use them in new applications; they will ! 530: ! 531: go away soon. ! 532: ! 533: ! 534: ! 535: Note that the TOS 1.0 desktop won't recognize drives above P. Other versions ! 536: ! 537: of TOS will, though, so you can use the Install Drive menu selection to ! 538: ! 539: install the pseudo drives so that the desktop can recognize them. ! 540: ! 541: ! 542: ! 543: ! 544: ! 545: File Handles and Devices ! 546: ! 547: ! 548: ! 549: File handle -1 refers to the current control terminal, NOT necessarily ! 550: ! 551: the console (this is where it points by default). BIOS handle 2 also ! 552: ! 553: refers to the control terminal, so that e.g. Bconout(2, c) outputs ! 554: ! 555: a character to the control terminal. Thus, ! 556: ! 557: Fforce(-1, Fopen("U:\DEV\MODEM1", 3)); ! 558: ! 559: r = Bconin(2); ! 560: ! 561: reads a character from the RS232 port under MiNT. This is done so that ! 562: ! 563: programs that use the BIOS for I/O will be able to run in windows or ! 564: ! 565: over the modem. Similarly, the DOS device CON: refers to the current ! 566: ! 567: control terminal, so Fopen("CON:", 3) is normally equivalent to Fdup(-1). ! 568: ! 569: To access the physical console, use device U:\DEV\CONSOLE. ! 570: ! 571: ! 572: ! 573: In a similar fashion, file handle -2 and bios device 1 (DOS device AUX:) ! 574: ! 575: may be redirected away from the RS232 port (device U:\DEV\MODEM1), and ! 576: ! 577: file handle -3 and bios device 0 (DOS device PRN:) may be directed away ! 578: ! 579: from the Centronics printer port (device U:\DEV\CENTR). Since both the DOS ! 580: ! 581: handles and BIOS device numbers are redirected, any program at all will ! 582: ! 583: obey the redirection unless it accesses the hardware directly (or unless ! 584: ! 585: it was written for MiNT and specifically uses the new device names ! 586: ! 587: like U:\DEV\CENTR; this should be done only if *absolutely* necessary!). ! 588: ! 589: See also the PRN= and CON= commands for mint.cnf, which provide another ! 590: ! 591: way to redirect the printer and console (actually, it's just another ! 592: ! 593: interface to the same method of redirection). ! 594: ! 595: ! 596: ! 597: File handles -4 and -5 are new with MiNT, and refer to the MIDI input ! 598: ! 599: and output devices respectively. Redirecting these handles will affect ! 600: ! 601: BIOS operations on bios device 4 (the MIDI port). ! 602: ! 603: ! 604: ! 605: ! 606: ! 607: Background Processes ! 608: ! 609: ! 610: ! 611: (Note that the programs bg.ttp and pipe.ttp, along with some other ! 612: ! 613: sample MiNT utilities, are found in a separate file called ! 614: ! 615: "mntutl.zoo"). ! 616: ! 617: ! 618: ! 619: Programs may be started in the background. A sample program ("bg.ttp") ! 620: ! 621: is provided that will do this for you. It works best from a shell; ! 622: ! 623: for example, to make foo.ttp in the background from gulam, type: ! 624: ! 625: cd \foo\src ! 626: ! 627: bg.ttp -o make.out make foo.ttp ! 628: ! 629: The "-o make.out" tells "bg" to redirect the command's standard tty, ! 630: ! 631: output, and error output (handles -1, 1, and 2) to "make.out". ! 632: ! 633: You might also want to redirect the standard input from an empty ! 634: ! 635: file, or from a file that will never have input waiting (like V:\NUL) ! 636: ! 637: so that "make" won't try to read anything from your console. ! 638: ! 639: ! 640: ! 641: Shells designed to work with MiNT (for example, the "mintshel.ttp" that is ! 642: ! 643: provided with the MiNT utilities) may use the Unix "&" notation for running ! 644: ! 645: processes in the background; with this notation, the job above would be: ! 646: ! 647: cd \foo\src ! 648: ! 649: make foo.ttp >make.out & ! 650: ! 651: (here the ">make.out" is the notation for redirecting the standard output ! 652: ! 653: of a process). Note that the sample shell does not provide a way of ! 654: ! 655: redirecting the standard error output; however, it does provide job ! 656: ! 657: control, and processes that try to write on the terminal ! 658: ! 659: will be stopped automatically. See "Job Control" below. ! 660: ! 661: ! 662: ! 663: ! 664: ! 665: Pipes ! 666: ! 667: ! 668: ! 669: Pipes are special files that are used to communicate between processes. The ! 670: ! 671: data in a pipe is always in memory, so using a pipe instead of a temporary ! 672: ! 673: file is usually faster; it also doesn't consume disk space. Only 2048 bytes ! 674: ! 675: can be held in a pipe at once; when a process tries to write more data, ! 676: ! 677: it is suspended until another process reads some data, thus "emptying" ! 678: ! 679: the pipe. If there are no more readers, a process writing on a pipe is ! 680: ! 681: terminated. ! 682: ! 683: ! 684: ! 685: A simple "pipe" program is provided to run two programs concurrently, ! 686: ! 687: passing data between them in a pipe. The syntax is ! 688: ! 689: pipe.ttp cmd1 cmd2 ! 690: ! 691: which is equivalent to the Unix "cmd1 | cmd2". Note that if cmd1 or cmd2 ! 692: ! 693: contain arguments, then you must run the "pipe" program from a shell that ! 694: ! 695: supports the Atari standard extended argument convention, and that you ! 696: ! 697: must enclose the commands in quotes, e.g. in gulam: ! 698: ! 699: set env_style mw # extended arguments ! 700: ! 701: pipe 'ls.ttp -l foo' 'fgrep.ttp myfile' ! 702: ! 703: does the same as the Unix command ! 704: ! 705: ls -l foo | fgrep myfile ! 706: ! 707: or using a temporary file ! 708: ! 709: ls -l foo >junk; fgrep myfile <junk; rm junk ! 710: ! 711: ! 712: ! 713: Shells designed to work explicitly with MiNT will probably not need the ! 714: ! 715: external "pipe" command, and instead will use the Unix notation for ! 716: ! 717: pipelines. This second method is preferable, as it provides a way of ! 718: ! 719: joining more than two programs in a pipeline. ! 720: ! 721: ! 722: ! 723: ! 724: ! 725: Job Control ! 726: ! 727: ! 728: ! 729: MiNT supports a terminal access protocol for job control. The ^Z ! 730: ! 731: (control-Z) key can be used to suspend a process. The process can ! 732: ! 733: be restarted again if it is sent the appropriate signal. There is ! 734: ! 735: also a "delayed" suspend key, ^Y, that takes effect only when ! 736: ! 737: a process attempts to read it. ! 738: ! 739: ! 740: ! 741: Some programs written for TOS put the terminal in "raw" mode, where no ! 742: ! 743: control characters are interpreted. You can use CTRL-ALT-Z to achieve ! 744: ! 745: the effect of ^Z for such programs. However, this feature should be used ! 746: ! 747: with caution -- it's possible that the TOS program had a good reason ! 748: ! 749: for not wanting to be interrupted! ! 750: ! 751: ! 752: ! 753: Once a program has been suspended, it must be restarted again. MiNT ! 754: ! 755: aware shells (e.g. mintshel.ttp) usually provide some sort of ! 756: ! 757: "fg" command that restarts the suspended process and brings it to ! 758: ! 759: the foreground. This suspend-restart cycle may be performed any ! 760: ! 761: number of times. ! 762: ! 763: ! 764: ! 765: If the terminal mode "tostop" is set (this is the default), then any ! 766: ! 767: background program that tries to write to the console will be suspended ! 768: ! 769: automatically; it must then be brought to the foreground with the ! 770: ! 771: "fg" command before the write continues. This behavior may be changed ! 772: ! 773: with the "stty" utility; after an "stty -tostop" command is issued, ! 774: ! 775: background programs will no longer be suspended when they write to the ! 776: ! 777: terminal. ! 778: ! 779: ! 780: ! 781: Background programs that try to read input from the console will also ! 782: ! 783: be automatically suspended until brought into the foreground. This ! 784: ! 785: happens regardless of the setting of the "tostop" flag. ! 786: ! 787: ! 788: ! 789: ! 790: ! 791: Programming with MiNT ! 792: ! 793: ! 794: ! 795: A file (mintbind.h) is provided that gives a C interface to the new ! 796: ! 797: MiNT system calls. Users of other programming languages will have to write ! 798: ! 799: the interfaces themselves; it should be relatively straightforward, as long ! 800: ! 801: as your compiler provides a way to call GEMDOS directly. ! 802: ! 803: ! 804: ! 805: Testing for the presence of MiNT: ! 806: ! 807: ! 808: ! 809: There are several ways to check to see if MiNT is active. The best ! 810: ! 811: way is to check the cookie jar; MiNT installs a cookie of ! 812: ! 813: 0x4d694e54 (in ASCII, 'MiNT'), with a value consisting of the major/ ! 814: ! 815: minor version numbers in the high/low bytes of the low word. Thus, MiNT ! 816: ! 817: version 1.2 will have a cookie value of 0x00000102L. (This isn't ! 818: ! 819: the place to explain the cookie jar, but basically it's a list of ! 820: ! 821: (cookie, value) pairs of longwords, terminated by cookie 0; a pointer ! 822: ! 823: to the jar is found at 0x5a0. MiNT always installs a cookie jar; versions ! 824: ! 825: of TOS prior to 1.6 don't always, in which case 0x5a0 will contain 0). ! 826: ! 827: ! 828: ! 829: A "quick and dirty" way to see if MiNT is active is to make a system ! 830: ! 831: call that only exists under MiNT (preferably one with no side effects!). ! 832: ! 833: Pgetpid() or Syield() are good choices. If MiNT is not active, these ! 834: ! 835: calls will fail, returning -32 (invalid function). This method has the ! 836: ! 837: disadvantage that future versions of TOS, or other multitasking programs, ! 838: ! 839: may use the same trap numbers as MiNT, but have different meanings. ! 840: ! 841: For this reason, the "cookie jar" method is preferred. ! 842: ! 843: ! 844: ! 845: Interprocess Communication: ! 846: ! 847: ! 848: ! 849: MiNT provides 5 forms of interprocess communication (IPC): signals, fifos, ! 850: ! 851: shared memory, message passing, and semaphores. ! 852: ! 853: ! 854: ! 855: Signals: ! 856: ! 857: ! 858: ! 859: Signals are a way of notifying a process of an event. The Pkill(pid, sig) ! 860: ! 861: system call is used to send signal number "sig" to the process with process ! 862: ! 863: id "pid". It is called "Pkill" because the default action of most signals is ! 864: ! 865: to terminate the process. If a process wishes to catch a signal and do ! 866: ! 867: processing, it can use the Psignal(sig, func) system call to arrange to have ! 868: ! 869: function "func" called when signal "sig" is received. If func is 0, then ! 870: ! 871: the default action is restored. If func is 1, then the signal will be ignored. ! 872: ! 873: ! 874: ! 875: Processes can temporarily block receipt of signals via the Psigblock() and ! 876: ! 877: Psigsetmask() system calls. ! 878: ! 879: ! 880: ! 881: See the file "signal.doc" for a more complete explanation of signals. ! 882: ! 883: ! 884: ! 885: Fifos: ! 886: ! 887: ! 888: ! 889: Fifos are "first in first out" message queues. Pipes are a special kind of ! 890: ! 891: (unidirectional) fifo. Fifos are represented by files in the subdirectory ! 892: ! 893: "PIPE" on drive "U:". They are created with the Fcreate(name, flags) ! 894: ! 895: system call. "name" will be the name under which the fifo is known ! 896: ! 897: (maximum 13 characters); "flags" is explained below. The returned file handle ! 898: ! 899: is treated just like an ordinary file, and may be written to and read from ! 900: ! 901: (unless the fifo is unidirectional, in which case it may only be written to). ! 902: ! 903: The program that creates the fifo is normally called the "server". Other ! 904: ! 905: programs ("clients") may use the Fopen(name, mode) system call to open the ! 906: ! 907: other end of the fifo and read the data that the server writes, or write data ! 908: ! 909: for the server to read. When the last program (either client or server) using ! 910: ! 911: a fifo closes it, the fifo is deleted automatically. Note that one program can ! 912: ! 913: be both client and server, if it creates a fifo with Fcreate and then opens it ! 914: ! 915: again with Fopen. Also, children of the server can inherit the Fcreate'd file ! 916: ! 917: handle and thus have access to the "server" side of the fifo. ! 918: ! 919: ! 920: ! 921: The bits in the "flags" argument to Fcreate have the following meanings: ! 922: ! 923: 0x01: make fifo unidirectional (server can write, clients can read) ! 924: ! 925: 0x02: cause reads to return EOF if no other processes are writing, and writes ! 926: ! 927: to raise the SIGPIPE signal if no other processes are reading. The ! 928: ! 929: default action (if this flag is not given) is to block waiting for ! 930: ! 931: reads and writes ! 932: ! 933: 0x04: make the fifo a pseudo-tty; to client processes, the fifo will act ! 934: ! 935: just like a terminal with the server "typing" the characters; for ! 936: ! 937: example, if the server writes a ^C, SIGINT will be sent to clients ! 938: ! 939: ! 940: ! 941: Attempting to Fcreate() a fifo with the same name as an already existing ! 942: ! 943: one will result in an access error (i.e. the Fcreate will fail). ! 944: ! 945: ! 946: ! 947: Pipes may be created through the Fpipe() system call as well as through ! 948: ! 949: the Fcreate/Fopen pair; the former method is easier, since the kernel ! 950: ! 951: takes care of name conflicts, etc. ! 952: ! 953: ! 954: ! 955: Fifos may be locked by processes via the Fcntl system call, as follows: ! 956: ! 957: ! 958: ! 959: struct flock { ! 960: ! 961: short l_type; /* type of lock */ ! 962: ! 963: #define F_RDLCK 0 ! 964: ! 965: #define F_WRLCK 1 ! 966: ! 967: #define F_UNLCK 3 ! 968: ! 969: short l_whence; /* what is the lock relative to? */ ! 970: ! 971: /* 0 == start of file, 1 == current pos. in file, 2 == EOF */ ! 972: ! 973: long l_start; /* start of locked region */ ! 974: ! 975: long l_len; /* 0 for rest of file */ ! 976: ! 977: short l_pid; /* set by F_GETLK */ ! 978: ! 979: }; ! 980: ! 981: ! 982: ! 983: Fcntl(fd, &lock, F_SETLK): set a lock as specified by the lock structure. ! 984: ! 985: The current version of MiNT only understands locks on the whole FIFO, ! 986: ! 987: so lock.l_start and lock.l_len should both be 0. If lock.l_type is F_UNLCK, ! 988: ! 989: then the lock is released. Otherwise, the file whole file is locked ! 990: ! 991: (future versions of MiNT may distinguish between read and write locks, ! 992: ! 993: but for now all locks are treated as write locks (F_WRLCK) and block both ! 994: ! 995: reads and writes). If another process has locked the fifo, returns -36 ! 996: ! 997: (access denied). If a process holding a lock terminates, the fifo is ! 998: ! 999: automatically unlocked. ! 1000: ! 1001: ! 1002: ! 1003: Fcntl(fd, &lock, F_GETLK): if a lock exists on the fifo, set lock to ! 1004: ! 1005: indicate what kind of lock it is; otherwise, set lock.l_type to F_UNLCK. ! 1006: ! 1007: ! 1008: ! 1009: Locks are only "advisory"; that is, programs may ignore locks if they ! 1010: ! 1011: choose to do so. However, they are a good way to insure that two clients' ! 1012: ! 1013: data are not mixed together in a fifo. ! 1014: ! 1015: ! 1016: ! 1017: NOTE: file locking will eventually be implemented for all files, but ! 1018: ! 1019: for now only fifos support file locking. ! 1020: ! 1021: ! 1022: ! 1023: See the sample LPR and LPD utilites for a demonstration of how to use fifos. ! 1024: ! 1025: ! 1026: ! 1027: Shared memory: ! 1028: ! 1029: ! 1030: ! 1031: Children created with the Pexec(4,...) or with Pexec(104,...) share all of ! 1032: ! 1033: their parent's memory, as do children created with the Pvfork() system call. ! 1034: ! 1035: Hence, they may communicate with their parent (or with each other) via ! 1036: ! 1037: global variables. ! 1038: ! 1039: ! 1040: ! 1041: A more general shared memory mechanism is provided by U:\SHM. Files in ! 1042: ! 1043: that directory represent blocks of memory. A program may offer to share ! 1044: ! 1045: its memory by creating a file in U:\SHM and executing an Fcntl call ! 1046: ! 1047: (SHMSETBLK) to associate a block of memory with the file. Other programs ! 1048: ! 1049: may then open the file and do a SHMGETBLK call to gain access to that ! 1050: ! 1051: memory. ! 1052: ! 1053: ! 1054: ! 1055: Rendezvous: ! 1056: ! 1057: ! 1058: ! 1059: The Pmsg() system call provides a simple message based form of IPC. See ! 1060: ! 1061: the manual page for Pmsg for further details. The use of FIFOs is generally ! 1062: ! 1063: to be preferred to Pmsg(), since they are more flexible. ! 1064: ! 1065: ! 1066: ! 1067: Semaphores: ! 1068: ! 1069: ! 1070: ! 1071: Semaphores may be created and otherwise accessed via the Psemaphore ! 1072: ! 1073: system call. See the manual page for Psemaphore for more details. ! 1074: ! 1075: ! 1076: ! 1077: ! 1078: ! 1079: MiNT extensions to GEMDOS calls: ! 1080: ! 1081: ! 1082: ! 1083: Fsfirst/Fsnext: ! 1084: ! 1085: MiNT domain processes (see the Pdomain()) system call below) get ! 1086: ! 1087: lower case filenames from Fsfirst/Fsnext on a TOS filesystem. This is ! 1088: ! 1089: because most programs end up converting them to lowercase anyways, to ! 1090: ! 1091: be more Unix-like. *Please* don't do this translation yourself, let ! 1092: ! 1093: MiNT handle it -- some filesystems (e.g. the minix one) are case ! 1094: ! 1095: sensitive! If you really, truly, prefer uppercase filenames, run in ! 1096: ! 1097: the TOS domain. ! 1098: ! 1099: ! 1100: ! 1101: Pexec(100, name, cmdline, environment): ! 1102: ! 1103: Similar to Pexec(0, ...), except the calling program does not wait for ! 1104: ! 1105: the child to finish. Returns a negative error code, or the (positive) ! 1106: ! 1107: process I.D. of the child. ! 1108: ! 1109: ! 1110: ! 1111: Pexec(104, name, basepage, 0L): ! 1112: ! 1113: Similar to Pexec(4, ...); starts executing a basepage previously ! 1114: ! 1115: set up by Pexec mode 3, 5, or 7. The caller does not wait for ! 1116: ! 1117: the child to finish. Returns a negative error code, or the process I.D. ! 1118: ! 1119: of the child. Note that the child's environment and basepage are ! 1120: ! 1121: owned by both the child and the parent (indeed, the child shares all ! 1122: ! 1123: memory owned by the parent). "name" is a pointer to a string ! 1124: ! 1125: to be used to supply a name for the new process; if it is NULL, then ! 1126: ! 1127: the parent's name is used. ! 1128: ! 1129: ! 1130: ! 1131: Pexec(106, name, basepage, 0L): ! 1132: ! 1133: Similar to Pexec(104,...) except that the child's environment and ! 1134: ! 1135: basepage are *not* owned by the parent; nor does the child share ! 1136: ! 1137: any memory allocated to the parent. ! 1138: ! 1139: ! 1140: ! 1141: Pexec(200, name, cmdline, environment): ! 1142: ! 1143: As with Pexec(0,...) and Pexec(100,...) this runs a program. However, ! 1144: ! 1145: with this variant the caller is completely replaced with the executing ! 1146: ! 1147: program. The process retains its process i.d. and most other attributes, ! 1148: ! 1149: but all of its memory is freed and a new address space is set up for it ! 1150: ! 1151: containing the code from the indicated program. Whereas Pexec(0,...) ! 1152: ! 1153: is like a subroutine call, Pexec(200,...) is like a "goto". It returns ! 1154: ! 1155: only if an error occurs that makes it impossible to run the indicated ! 1156: ! 1157: program (e.g. if not enough memory is available, or the file is not ! 1158: ! 1159: found). ! 1160: ! 1161: ! 1162: ! 1163: ! 1164: ! 1165: New MiNT calls: ! 1166: ! 1167: ! 1168: ! 1169: See the manual pages in the man/ subdirectory for descriptions of ! 1170: ! 1171: these calls. ! 1172: ! 1173: ! 1174: ! 1175: void Syield(): [ GEMDOS 0xff ] ! 1176: ! 1177: word Fpipe( word *ptr ): [ GEMDOS 0x100 ] ! 1178: ! 1179: long Fcntl( word f, long arg, word cmd): [ GEMDOS 0x104 ] ! 1180: ! 1181: long Finstat( word f ): [ GEMDOS 0x105 ] ! 1182: ! 1183: long Foutstat( word f ) [ GEMDOS 0x106 ] ! 1184: ! 1185: long Fgetchar(word f, word mode): [ GEMDOS 0x107 ] ! 1186: ! 1187: long Fputchar( word f, long c, word mode ): [ GEMDOS 0x108 ] ! 1188: ! 1189: long Pwait(): [ GEMDOS 0x109 ] ! 1190: ! 1191: word Pnice( word delta ): [ GEMDOS 0x10a ] ! 1192: ! 1193: word Pgetpid(): [ GEMDOS 0x10b ] ! 1194: ! 1195: word Pgetppid(): [ GEMDOS 0x10c ] ! 1196: ! 1197: word Pgetpgrp(): [ GEMDOS 0x10d ] ! 1198: ! 1199: word Psetpgrp(pid, newgrp): [ GEMDOS 0x10e ] ! 1200: ! 1201: word Pgetuid(): [ GEMDOS 0x10f ] ! 1202: ! 1203: word Psetuid( word id ): [ GEMDOS 0x110 ] ! 1204: ! 1205: word Pkill( word pid, word sig ): [ GEMDOS 0x111 ] ! 1206: ! 1207: long Psignal(word sig, long handler): [ GEMDOS 0x112 ] ! 1208: ! 1209: word Pvfork(): [ GEMDOS 0x113 ] ! 1210: ! 1211: word Pgetgid(): [ GEMDOS 0x114 ] ! 1212: ! 1213: word Psetgid(word id): [ GEMDOS 0x115 ] ! 1214: ! 1215: long Psigblock(long mask): [ GEMDOS 0x116 ] ! 1216: ! 1217: long Psigsetmask(long mask): [ GEMDOS 0x117 ] ! 1218: ! 1219: long Pusrval(long arg): [ GEMDOS 0x118 ] ! 1220: ! 1221: word Pdomain(word newdom): [ GEMDOS 0x119 ] ! 1222: ! 1223: void Psigreturn(): [ GEMDOS 0x11a ] ! 1224: ! 1225: word Pfork(): [ GEMDOS 0x11b ] ! 1226: ! 1227: long Pwait3(word flag, long *rusage): [ GEMDOS 0x11c ] ! 1228: ! 1229: word Fselect(word timeout, long *rfds, long *wfds, long *xfds): ! 1230: ! 1231: [ GEMDOS 0x11d ] ! 1232: ! 1233: void Prusage( long r[8] ): [ GEMDOS 0x11e ] ! 1234: ! 1235: long Psetlimit(word lim, long value): [ GEMDOS 0x11f ] ! 1236: ! 1237: long Talarm( long secs ): [ GEMDOS 0x120 ] ! 1238: ! 1239: void Pause(): [ GEMDOS 0x121 ] ! 1240: ! 1241: long Sysconf( word n ): [ GEMDOS 0x122 ] ! 1242: ! 1243: long Psigpending() [ GEMDOS 0x123 ] ! 1244: ! 1245: long Dpathconf( char *name, word n ): [ GEMDOS 0x124 ] ! 1246: ! 1247: long Pmsg( word mode, long mbox, void *msg ): [ GEMDOS 0x125 ] ! 1248: ! 1249: long Fmidipipe( word pid, word in, word out ): [ GEMDOS 0x126 ] ! 1250: ! 1251: word Prenice( word pid, word delta ): [ GEMDOS 0x127 ] ! 1252: ! 1253: long Dopendir( char *name, word flag ): [ GEMDOS 0x128 ] ! 1254: ! 1255: long Dreaddir( word buflen, long dir, char *buf):[GEMDOS 0x129 ] ! 1256: ! 1257: long Drewinddir( long dir ): [ GEMDOS 0x12a ] ! 1258: ! 1259: long Dclosedir( long dir ): [ GEMDOS 0x12b ] ! 1260: ! 1261: long Fxattr( word flag, char *name, void *buf ):[ GEMDOS 0x12c ] ! 1262: ! 1263: long Flink( char *oldname, char *newname ): [ GEMDOS 0x12d ] ! 1264: ! 1265: long Fsymlink( char *oldname, char *newname ): [ GEMDOS 0x12e ] ! 1266: ! 1267: long Freadlink( word siz, char *buf, char *name):[GEMDOS 0x12f ] ! 1268: ! 1269: long Dcntl( word cmd, char *name, long arg ): [ GEMDOS 0x130 ] ! 1270: ! 1271: long Fchown( char *name, word uid, word gid): [ GEMDOS 0x131 ] ! 1272: ! 1273: long Fchmod( char *name, word mode ): [ GEMDOS 0x132 ] ! 1274: ! 1275: word Pumask( word mask ): [ GEMDOS 0x133 ] ! 1276: ! 1277: long Psemaphore(word mode, long id, long timeout): [ GEMDOS 0x134 ] ! 1278: ! 1279: word Dlock( word mode, word drive ): [ GEMDOS 0x135 ] ! 1280: ! 1281: void Psigpause( long sigmask ): [ GEMDOS 0x136 ] ! 1282: ! 1283: long Psigaction( word sig, long act, long oact):[ GEMDOS 0x137 ] ! 1284: ! 1285: long Pgeteuid(): [ GEMDOS 0x138 ] ! 1286: ! 1287: long Pgetegid(): [ GEMDOS 0x139 ] ! 1288:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.