File: pvm_fork.c

package info (click to toggle)
pvm 3.4.6-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 8,284 kB
  • sloc: ansic: 72,074; makefile: 1,198; fortran: 631; sh: 285; csh: 74; asm: 37
file content (85 lines) | stat: -rw-r--r-- 2,247 bytes parent folder | download | duplicates (14)
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;
}