/* Test making a process group with two members and moving the leader out of the group and then back into it. */ #include "process.h" int main(void) { // Clean up children once pipe is closed. int pipes[2]; if ( pipe(pipes) < 0 ) err(1, "pipe"); pid_t pgid = fork(); if ( pgid < 0 ) err(1, "fork"); char c; if ( !pgid ) { close(pipes[1]); read(pipes[0], &c, 1); exit(0); } if ( !kill(-pgid, 0) ) errx(1, "process group already existed"); if ( setpgid(pgid, pgid) < 0 ) err(1, "setpgid on leader"); if ( kill(-pgid, 0) < 0 ) errx(1, "process was not created"); pid_t member = fork(); if ( member < 0 ) err(1, "fork"); if ( !member ) { close(pipes[1]); read(pipes[0], &c, 1); exit(0); } if ( setpgid(member, pgid) < 0 ) err(1, "setpgid on member"); if ( setpgid(pgid, getpgid(0)) < 0 ) err(1, "setpgid undo leader"); if ( kill(-pgid, 0) < 0 ) errx(1, "process was destroyed"); if ( getpgid(pgid) != getpgid(0) ) err(1, "leader was not undone"); if ( setpgid(pgid, pgid) < 0 ) err(1, "setpgid redo leader"); if ( getpgid(pgid) != pgid ) err(1, "leader was not redone"); return 0; }