1. Introduction#

In the first part of this book we will introduce the foundations of our topic.

1.1. Overview#

What a grand adventure we have begun.

Listing 1.1 simple python code block#
1print("hello, world")
2print("hello, world")
3print("hello, world")
4print("hello, world")

Here is the example C code

Listing 1.2 testfork.c#
 1#include <sys/types.h>
 2#include <unistd.h>
 3#include <stdio.h>
 4#include <stdlib.h>
 5
 6int
 7main(int argc, char* argv[]) 
 8{
 9  pid_t mypid, cpid, ppid;
10  cpid = fork();
11  ppid = getppid();
12  mypid = getpid();
13
14  if (cpid > 0) {
15    /* Parent code */ 
16    printf("hello, from parent with pid %d, pid of child is %d\n", mypid, cpid);
17  } else if (cpid == 0) {
18    /* Child code */
19    printf("hello, I am child with pid %d, my parent is %d\n", mypid, ppid);
20  } else {
21    perror("fork failed\n");
22    exit(-1);
23  }
24  return 0;
25}

Here is another example C code

Listing 1.3 doforke.c#
 1#include <sys/types.h>
 2#include <unistd.h>
 3#include <stdio.h>
 4#include <stdlib.h>
 5#include <sys/wait.h>
 6#include "doforke.h"
 7
 8
 9int
10do_fork_exec(char *prog, char *const argv[])
11{
12  pid_t cpid;
13  int status=0;
14  cpid = fork();
15  if (cpid < 0) {
16    perror("fork failed\n");
17    exit(-1);
18  }
19
20  if (cpid != 0) {
21    // parent code, we need to wait for child
22    waitpid(cpid,&status,0);
23  } else {
24    execve(prog, argv, 0);
25    perror("should never get here\n");
26  }
27  return status;
28}