home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
001-099
/
ff005.lzh
/
proctest
/
proctest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-01-12
|
6KB
|
178 lines
/*
*
* DISCLAIMER:
*
* This program is provided as a service to the programmer
* community to demonstrate one or more features of the Amiga
* personal computer. These code samples may be freely used
* for commercial or noncommercial purposes.
*
* Commodore Electronics, Ltd ("Commodore") makes no
* warranties, either expressed or implied, with respect
* to the program described herein, its quality, performance,
* merchantability, or fitness for any particular purpose.
* This program is provided "as is" and the entire risk
* as to its quality and performance is with the user.
* Should the program prove defective following its
* purchase, the user (and not the creator of the program,
* Commodore, their distributors or their retailers)
* assumes the entire cost of all necessary damages. In
* no event will Commodore be liable for direct, indirect,
* incidental or consequential damages resulting from any
* defect in the program even if it has been advised of the
* possibility of such damages. Some laws do not allow
* the exclusion or limitation of implied warranties or
* liabilities for incidental or consequential damages,
* so the above limitation or exclusion may not apply.
*
*/
/* system software version: V1.1 */
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/libraries.h"
#include "exec/ports.h"
#include "exec/interrupts.h"
#include "exec/io.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "workbench/startup.h"
#define PRIORITY 0
#define STACKSIZE 5000
extern struct Message *GetMsg();
extern int LoadSeg();
extern struct MsgPort *CreateProc();
struct mymess {
struct Message sysmess;
int outpointer;
int errpointer;
};
struct mymess pmsg;
struct WBStartup wbm;
main()
{
struct WBStartup *msg; /* message that we send to the
* process to wake it up */
struct Message *reply;
struct Process *myprocess;
struct mymess *parms; /* message to contain my own parameters
* to pass on to spawned process, sample
* only. Just to prove that we correctly
* create a process, we are giving it
* something other than nil: as its
* stdout and stderr... in fact, giving
* it OUR values so we can share the
* same output window.
*/
/* The WBStartup message could be dynamically allocated or statically
* as it is done in this case. Because of the static allocation,
* poor main() has to go to sleep forever after starting up
* the daughter process, waiting for a message to arrive at
* its message port before it can actually exit.
*/
/* because main() is itself started as a process, it automatically
* has a message port allocated for itself. Located at
* &((struct Process *)FindTask(0))->pr_MsgPort
*/
int littleSeg;
struct MsgPort *mainport; /* pointer to main's msg port */
struct MsgPort *littleProc; /* pointer to daughter's msg port */
/* LOAD THE PROGRAM TO BE STARTED FROM MAIN ****************************** */
littleSeg = LoadSeg("littleproc");
if(littleSeg == 0)
{
printf("\nFile not found");
exit(999);
}
/* CREATE A PROCESS FOR THIS OTHER PROGRAM ******************************* */
littleProc = CreateProc("littleguy",PRIORITY, littleSeg, STACKSIZE);
if( littleProc == 0 )
{
printf("\Couldn't create the process");
UnLoadSeg(littleSeg);
exit( 1000 );
}
/* ********************************************************************** */
/* locate the message port that is allocated as part of the process
that started main() in the first place */
myprocess = (struct Process *)FindTask(0);
mainport = &myprocess->pr_MsgPort;
/* ********************************************************************** */
/* THIS CODE BLOCK STARTS THE PROCESS RUNNING, AS THOUGH CALLED FROM WBENCH */
/* this message block is a wakeup call to the process we created. */
msg = &wbm;
/* preset the necessary arguments for message passing */
msg->sm_Message.mn_ReplyPort = mainport;
msg->sm_Message.mn_Length = sizeof(struct WBStartup);
/* passing no workbench arguments to this process; we are not WBench */
msg->sm_ArgList = NULL;
/* if the process is being opened without a ToolWindow (Workbench
* sets this up) as a parent, we should simply go on to do main() */
msg->sm_ToolWindow = NULL;
PutMsg(littleProc,msg); /* send the startup message */
/* ************************************************************************ */
/* just a sample message, still using the same message and reply ports */
parms = &pmsg;
parms->sysmess.mn_ReplyPort = mainport;
parms->sysmess.mn_Length = sizeof(struct mymess);
parms->outpointer = Output();
parms->errpointer = Output();
PutMsg(littleProc,parms); /* send him our parameters */
WaitPort(mainport); /* wait for the reply from parameter pass. */
reply = GetMsg(mainport); /* value should be "parms" if checked */
WaitPort(mainport); /* wait for the return of the wbstartup
* message before main itself is allowed
* to exit. */
reply = GetMsg(mainport); /* value should be "msg" if checked */
/* NOTE: there should be checking here to see if the message
* received at this port was the string, or the wakeup call.
* This sample code only assumes that the string is received
* and replied first, then the wakeup call message is returned
* as the little task is exiting.
*/
UnLoadSeg(littleSeg);
printf("\nSlave process exited, master unloaded its code/data");
} /* end of main */