fork(),pipe()和exec()进程创建和通信

coo*_*ool 5 c operating-system fork pipe

我必须编写使用创建进程的程序pipe().

我的第一个任务是编写一个父进程,使用该fork()函数生成四个子进程.

一旦fork()成功,将子进程替换为另一个进程rover1, rover2, rover3, and rover4,尽管它们都具有相同的代码.

这些过程的功能如下.

  1. 每个子进程最初都有自己的编号.它从父级接收新号码.使用以下公式,它创建自己的新数字,如下所示,并将其转发给父级:

    mynumber = (3 * mynumber + 4 * numberreceived)/7

  2. 此过程将继续,直到父级发送系统稳定的消息.父母也有其初始号码.它接收所有孩子的数量并计算其新数字,如下所示:

    mynumber = (3 * mynumber + numbers sent by all the children)/7

  3. 家长会将此号码发送给其所有孩子.此过程将继续,直到父级发现其号码不再更改为止.那时它会告诉孩子们系统已经稳定了.

这就是我所做的,但我的教授说我必须使用exec()来执行子进程并用另一个子进程替换子进程.我不知道如何使用exec().你能帮帮我吗?

我只附加了第一代儿童.

// I included stdio.h, unistd.h stdlib.h and errno.h 
int main(void)
{
  // Values returned from the four fork() calls
  pid_t rover1, rover2, rover3, rover4;

  int parentnumber, mynumber1, mynumber2, mynumber3, mynumber4;

  int childownnumber1 = 0, status = 1, childownnumber2 = 0,
      childownnumber3 = 0, childownnumber4 = 0, numberreceived = 0;

  printf("Enter parent number: ");
  printf("%d", parentnumber);
  printf("Enter each children number");
  printf("%d %d %d %d", mynumber1, mynumber2, mynumber3, mynumber4);

  // Create pipes for communication between child and parent
  int p1[2], p2[2];
  // Attempt to open pipe
  if (pipe(p1) == -1) {
    perror("pipe call error");
    exit(1);
  }
  // Attempt to open pipe
  if (pipe(p2) == -1) {
    perror("pipe call error");
    exit(1);
  }

  // Parent process generates 4 child processes
  rover1 = fork();

  // if fork() returns 0, we're in the child process;
  // call exec() for each child to replace itself with another process
  if (rover1 == 0) {
    for(; numberreceived != 1; ) {  
      close(p1[1]); // Close write end of pipe
      close(p2[0]); // Close read end of second pipe

      // Read parent's number from pipe
      read(p1[0], &numberreceived, sizeof(int));

      if (numberreceived == 1) {
        // System stable, end child process
        close(p1[0]);
        close(p2[1]);
        _exit(0); // End child process
      }

      mynumber1 = (int)((3*mynumber1 + 4*numberreceived)/7.0);

      printf("\nrover1 number: ");
      printf("%i", mynumber1);

      // Write to pipe
      write(p2[1], &mynumber1, sizeof(int));    
    }       
  }
  /* Error:
   * If fork() returns a negative number, an error happened;
   * output error message
   */
  if (rover1 < 0) {
    fprintf(stderr,
            "can't fork, child process 1 not created, error %d\n",
            errno);
    exit(EXIT_FAILURE);
  }
}
Run Code Online (Sandbox Code Playgroud)

jsc*_*ier 2

exec函数族用于用新进程替换当前进程。请注意替换一词的使用。一旦调用 exec,当前进程就会消失,新进程就会启动。如果要创建单独的进程,则必须首先创建子进程fork,然后exec在子进程中创建新的二进制文件。

使用这些exec函数类似于从命令行执行程序。要执行的程序以及传递给程序的参数在函数调用中提供exec

例如,以下exec命令*相当于后续的 shell 命令:

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);

/bin/ls -r -t -l

* 注意“arg0”是要执行的命令/文件名


由于这是家庭作业,因此很好地理解这个过程很重要。您可以首先阅读pipe、 、上的文档fork,并exec结合一些教程来更好地理解每个步骤。

以下链接应该有助于您入门: