1#include <errno.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <unistd.h>
6
7
8int
9main()
10{
11	pid_t parentPID = getpid();
12	printf("parent pid: %d\n", parentPID);
13	printf("parent pgid: %d\n", getpgrp());
14
15	pid_t childPID = fork();
16	if (childPID < 0) {
17		fprintf(stderr, "fork() failed: %s\n", strerror(errno));
18		exit(1);
19	} else if (childPID == 0) {
20		// child
21		childPID = getpid();
22		printf("child  pid: %d, pgid: %d\n", childPID, getpgrp());
23
24		printf("child  setpgid(0, 0)\n");
25		if (setpgid(0, 0) < 0) {
26			fprintf(stderr, "child: first setpgid() failed: %s\n", strerror(errno));
27			exit(1);
28		}
29//		printf("child  setsid()\n");
30//		if (setsid() < 0) {
31//			fprintf(stderr, "child: setsid() failed: %s\n", strerror(errno));
32//			exit(1);
33//		}
34
35		printf("child  pgid: %d\n", getpgrp());
36
37		pid_t grandChildPID = fork();
38		if (grandChildPID < 0) {
39			fprintf(stderr, "fork() 2 failed: %s\n", strerror(errno));
40			exit(1);
41		} else if (grandChildPID == 0) {
42			// grand child
43			grandChildPID = getpid();
44			printf("gchild pid: %d, pgid: %d\n", grandChildPID, getpgrp());
45			sleep(2);
46			printf("gchild pid: %d, pgid: %d\n", grandChildPID, getpgrp());
47		} else {
48			// child
49			sleep(1);
50
51			printf("child  setpgid(0, %d)\n", parentPID);
52			if (setpgid(0, parentPID) < 0) {
53//			printf("child  setpgid(0, 0)\n");
54//			if (setpgid(0, 0) < 0) {
55				fprintf(stderr, "child: second setpgid() failed: %s\n", strerror(errno));
56				exit(1);
57			}
58
59			printf("child  pgid: %d\n", getpgrp());
60		}
61
62	} else {
63		// parent
64		sleep(3);
65	}
66
67	return 0;
68}
69