Parent ends before child in linux.

We were asked to make a child process and make it end after a parent process ended, but I cant figure it out. I googled that parent proccess pid have to be 1, other ppl were googling how to avoid it, I tried their codes, but didnt work for me.
This makes a child, then ends it and then ends parent nd does this twice. I also dont have linux(only in class), so I cant check if this works.
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
#include <stdio.h>
#include <stdlib.h>

int main(void){
int pid1,pid2,pid3,pid4,status,died,i,ret;

switch(pid1=fork())
{
case -1: printf("Cant fork! C");
exit(-1);
case 0: printf("Im a Child!");
wait (0);
switch(pid4=fork())
{
case -1: printf("Cant fork! ");
exit(-1);
case 0: printf("Im a Child!");
exit(3);
default: died=wait(&status);
printf("\nChild %d B\n",pid4);
printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());
printf("%d died\n",died);
printf("Exit value %d\n",status>>8);
printf("Exit status %d\n",status&0377);
}
exit(3);
default: died=wait(&status);
printf("\nChild %d A\n",pid1);
printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
printf("%d died\n",died);
printf("Exit value %d\n",status>>8);
printf("Exit status %d\n",status&0377);
}
switch(pid2=fork())
{
case -1: printf("Cant fork!\n");
exit(-1);
case 0: printf("Im a Child! B\n");
      switch(pid3=fork())
      {
      case -1: 
	printf("Cant fork!");
      exit(-1);
      case 0: printf("Im a Child! D");
      exit(3);

      default: died=wait(&status);
      }
      printf("\nChild %d D\n",pid3);
      printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
      printf("%d died\n",died);
      printf("Exit value %d\n",status>>8);
      printf("Exit status %d\n",status&0377);
      exit(3);
default: died=wait(&status);
}
    
      printf("\nChild %d B\n",pid2);
      printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
      printf("%d died\n",died);
      printf("Exit value %d\n",status>>8);
      printf("Exit status %d\n",status&0377);

return 0;
}
I couldn't read that code, so I've reformatted it. The output is tricky to decipher too.
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
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int pid1,pid2,pid3,pid4,status,died,i,ret;

	switch(pid1=fork())
	{
	case -1:
		printf("Cant fork! C");
		exit(-1);
	case 0:
		printf("Im a Child!");
		wait(0);
		switch(pid4=fork())
		{
		case -1: printf("Cant fork! ");
			exit(-1);
		case 0: printf("Im a Child!");
			exit(3);
		default: died=wait(&status);
			printf("\nChild %d B\n",pid4);
			printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());
			printf("%d died\n",died);
			printf("Exit value %d\n",status>>8);
			printf("Exit status %d\n",status&0377);
		}
		exit(3);
	default:
		died=wait(&status);
		printf("\nChild %d A\n",pid1);
		printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
		printf("%d died\n",died);
		printf("Exit value %d\n",status>>8);
		printf("Exit status %d\n",status&0377);
	}

	switch(pid2=fork())
	{
	case -1: printf("Cant fork!\n");
		exit(-1);
	case 0:
		printf("Im a Child! B\n");
		switch(pid3=fork())
		{
		case -1: 
			printf("Cant fork!");
		exit(-1);
			case 0: printf("Im a Child! D");
			exit(3);
		default:
			died=wait(&status);
		}
		printf("\nChild %d D\n",pid3);
		printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
		printf("%d died\n",died);
		printf("Exit value %d\n",status>>8);
		printf("Exit status %d\n",status&0377);
		exit(3);
	default:
		died=wait(&status);
	}
    
	printf("\nChild %d B\n",pid2);
	printf("\nPID  - %d and PPID - %d\n",getpid(),getppid());  
	printf("%d died\n",died);
	printf("Exit value %d\n",status>>8);
	printf("Exit status %d\n",status&0377);

	return 0;
}


Why are child processes calling wait(0)?

You don't need all that stuff, surely one child should be enough.
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
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int pid = fork();
        switch (pid)
        {
        case -1:
                printf("Cant fork!");
                exit(-1);

        case 0:
                sleep(1);       // let parent die

                printf("child creating process group\n");
                setsid();

                // do some work for a minute or so
                for (int i = 0; i < 60; ++i)
                {
                        printf(".");
                        fflush(stdout);
                        sleep(1);
                }
                printf("\n");
                exit(0);

        default:
                printf("parent terminating\n");
                exit(0);
        }

        return 0;
}
Thanks you guys.
Topic archived. No new replies allowed.