[comp.os.msdos.programmer] Answers and Data for Re: Child processes in Mess-Dos

lfk@athena.mit.edu (Lee F Kolakowski) (10/04/90)

Here is the scoop on the child processes in "C". Not MSDOS.
All putatively ANSI compilers adhere to this. I use MSC
and since version 4.0 It has followed these rules.


spawn family:
	This family of functions takes either an argv style args or
	a NULL terminated list of arguments. There are four
	versions of each and *NONE* of these execute command.com
	unless command.com is the argument of the function.
		spawnl{pe}	-	"l"	means list
						the argv[0] argument
						must be a complete
						pathname.
					"lp"	list and path
						the argv[0] argument
						does not need to be a 
						full path, the path will
						be searched.
					"le"	list and environment
						the argv[0] argument
						must be a complete
						pathname. The environment
						can be modified and passed 
						as a NULL terminated list 
						to the sub process.
					"lpe"	list, path, environment
						the argv[0] argument
						does not need to be a 
						full path, the path will
						be searched. The
						environment can be modified 
						and passed
						as a NULL terminated list 
						to the sub process.

		spawnv{pe}	-	"v"	means vector
						this means an argv like 
						argument where
						argv[n+1] == NULL.
						all the different
						versions are just as
						specified above.

	All of the spawn family have a mode. In MSDOS the modes
are P_OVERLAY and P_WAIT. P_NOWAIT and others are not implemented.
P_WAIT says run the command specified with the arguments specified on
top of the current process, and then return to the current process
upon completion of the child. P_NOWAIT overlays the current process
with the child.

exec family:
	This is exactly the same as the spawn functions with
P_NOWAIT as the mode. All eight functions as specified above
execl{pe}, execv{pe}. Again unless command.com is the argument to be
executed It is not loaded.

system:
	loads command.com and executes the command specified.

popen:
	runs the command specified under the command processor
	asynchronously. (Not really valid under MSDOS, but there
	are impletmentations of it.

for example
/* A test program */
#include <stdio.h>
#include <process.h>

main()
{
	char * command = "ps";
	spawnlp(P_WAIT, "ps.exe", (char *) NULL);
/* the output of ps
PID  PPID SIZE DS   Command
3087 258c 0728 3097 (sh.exe) c:/bin/sh.exe -R 0 <- my shell
37b0 37ef 003a
37eb FREE 0003      48 bytes
37ef 3087 1206 39f5 (test.exe) ./test.exe <- the test program
49f6 4a31 003a
4a31 37ef 02c0 4be3 c:/bin/ps.exe <- the process started by spawn on top
4cf2 FREE 5303      340016 bytes     of the test program
9ff6 3087 000a*/
	system("ps.exe");
/* The output of ps
PID  PPID SIZE DS   Command
3087 258c 0728 3097 (sh.exe) c:/bin/sh.exe -R 0 <- my shell
37b0 37ef 003a
37eb FREE 0003      48 bytes
37ef 3087 1206 39f5 (test.exe) ./test.exe <- the test program
49f6 4a32 003b
4a32 4a32 00d3 4a32 (command.com) c:/bin/command.com <- the "system"
4b06 4a32 0039
4b40 4b7b 003a
4b7b 4a32 02c0 4d2d c:/bin/PS.EXE <- the process run by system
4e3c FREE 51b9      334736 bytes
9ff6 3087 000a*/
	execlp("ps.exe", (char *) NULL);
/* The output of ps.exe
PID  PPID SIZE DS   Command
3087 258c 0728 3097 (sh.exe) c:/bin/sh.exe -R 0 <- my starting shell
37b0 FREE 003a      928 bytes
37eb FREE 0003      48 bytes
37ef 3087 02c0 39a1 (test.exe) c:/bin/ps.exe < the ps program overlayed
3ab0 FREE 6509      413840 bytes               the test program
9fba 37ef 003a
9ff5 FREE 0000      0 bytes
9ff6 3087 000a*/
}



Note in all cases the amount of free memory after the last process.
This should answer all youe questions.

--

Frank Kolakowski 

======================================================================
|lfk@athena.mit.edu                     ||      Lee F. Kolakowski    |
|lfk@eastman2.mit.edu                   ||	M.I.T.		     |
|kolakowski@wccf.mit.edu                ||	Dept of Chemistry    |
|lfk@mbio.med.upenn.edu		        ||	Room 18-506	     |
|lfk@hx.lcs.mit.edu                     ||	77 Massachusetts Ave.|
|AT&T:  1-617-253-1866                  ||	Cambridge, MA 02139  |
|--------------------------------------------------------------------|
|                         #include <woes.h>         		     |
|		           One-Liner Here!                           |
======================================================================