#include #include #include #include #include int main() { pid_t parentPID = getpid(); printf("parent pid: %d\n", parentPID); printf("parent pgid: %d\n", getpgrp()); pid_t childPID = fork(); if (childPID < 0) { fprintf(stderr, "fork() failed: %s\n", strerror(errno)); exit(1); } else if (childPID == 0) { // child childPID = getpid(); printf("child pid: %d, pgid: %d\n", childPID, getpgrp()); printf("child setpgid(0, 0)\n"); if (setpgid(0, 0) < 0) { fprintf(stderr, "child: first setpgid() failed: %s\n", strerror(errno)); exit(1); } // printf("child setsid()\n"); // if (setsid() < 0) { // fprintf(stderr, "child: setsid() failed: %s\n", strerror(errno)); // exit(1); // } printf("child pgid: %d\n", getpgrp()); pid_t grandChildPID = fork(); if (grandChildPID < 0) { fprintf(stderr, "fork() 2 failed: %s\n", strerror(errno)); exit(1); } else if (grandChildPID == 0) { // grand child grandChildPID = getpid(); printf("gchild pid: %d, pgid: %d\n", grandChildPID, getpgrp()); sleep(2); printf("gchild pid: %d, pgid: %d\n", grandChildPID, getpgrp()); } else { // child sleep(1); printf("child setpgid(0, %d)\n", parentPID); if (setpgid(0, parentPID) < 0) { // printf("child setpgid(0, 0)\n"); // if (setpgid(0, 0) < 0) { fprintf(stderr, "child: second setpgid() failed: %s\n", strerror(errno)); exit(1); } printf("child pgid: %d\n", getpgrp()); } } else { // parent sleep(3); } return 0; }