1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
/*
* PVM version 3.4: Parallel Virtual Machine System
* University of Tennessee, Knoxville TN.
* Oak Ridge National Laboratory, Oak Ridge TN.
* Emory University, Atlanta GA.
* Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
* G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
* P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
* (C) 1997 All Rights Reserved
*
* NOTICE
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted
* provided that the above copyright notice appear in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* Neither the Institutions (Emory University, Oak Ridge National
* Laboratory, and University of Tennessee) nor the Authors make any
* representations about the suitability of this software for any
* purpose. This software is provided ``as is'' without express or
* implied warranty.
*
* PVM version 3 was funded in part by the U.S. Department of Energy,
* the National Science Foundation and the State of Tennessee.
*/
/*
* pvm_fork.c
*
* In the spirit of fork(), fork a process and enroll it as a new PVM task.
* If parent, returns task id (>0) of child, or error (<0).
* If child, returns 0.
*/
#ifdef IMA_TITN
#include <sys/socket.h>
#endif
#include <pvm3.h>
int
pvm_fork(cpid)
int *cpid; /* cpid returns child pid if nonnull */
{
int tid; /* tid to return (child tid or 0) */
int pid;
int pfd[2];
if ((tid = pvm_mytid()) > 0) {
if (
#ifdef IMA_TITN
socketpair(AF_UNIX, SOCK_STREAM, 0, pfd)
#else
pipe(pfd)
#endif
== -1)
tid = PvmOutOfRes;
else
if (pid = fork()) { /* parent */
close(pfd[1]);
if (cpid)
*cpid = pid;
if (pid == -1)
tid = PvmOutOfRes;
else
if (read(pfd[0], (char *)&tid, sizeof(tid)) != sizeof(tid))
tid = PvmOutOfRes;
close(pfd[0]);
} else { /* child */
close(pfd[0]);
pvmendtask();
tid = pvm_mytid();
write(pfd[1], (char *)&tid, sizeof(tid));
close(pfd[1]);
tid = 0;
}
}
return tid;
}
|