孩子执行整个过程

时间:2018-05-08 07:16:59

标签: c multiprocessing fork parent-child

以下命令输入到此代码中:“CREATE”,然后“QUIT”。当调用“CREATE”时,进程需要fork并在子进程中执行进一步的代码。

我的输出应为此(打印输入):

- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT

但是,我有这个:

- INPUT: CREATE
- CALLED_CREATE
- INPUT: QUIT
- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT

我对fork()的理解是,父进程将继续执行代码,如果它可供父进程使用,同样对于子进程 - 从指令fork()开始。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include "locker.h"

int main(){

    char user_input[100];

    int active_input = 0;

    int this_pid;

    while(active_input == 0){

        //receive user_input
        scanf("%s", user_input);
        printf("INPUT: %s\n", user_input);

        if(strcmp(user_input, "CREATE") == 0){

            printf("CALLED_CREATE\n");

            if((this_pid = fork()) < 0){
                perror("Failed to fork process");
                return EXIT_FAILURE;
            }

            //child
            if(this_pid == 0){

                printf("CHILD_PROCESS\n");
            }

            //parent
            if(this_pid > 0){

                //printf("PARENT_PROCESS\n");
            }
        }

        if(strcmp(user_input, "QUIT") == 0){
            active_input = 1;
            break;
        }
    }
}

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

我怀疑主要的问题是你没有停止孩子的过程。例如,在您输入一次CREATE之后,子进程将打印CHILD PROCESS,但将继续在其自己的进程中循环,而父进程也是如此。

您应确保在执行有意义的操作后退出子进程。另外,如上面Chrono Kitsune所述,父母需要wait()让子进程获得退出状态并防止僵尸。

除此之外,您的用户输入缓冲区为100个字符,打开您的程序以缓冲溢出攻击。但那是一个不同的故事。

你的代码稍微改了一些,我觉得你做了什么:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

int main() {
  char user_input[100];
  int this_pid;

  while (1) {
    //receive user_input
    scanf("%s", user_input);
    printf("INPUT: %s\n", user_input);

    if(strcmp(user_input, "CREATE") == 0){
      printf("CALLED_CREATE\n");

      if((this_pid = fork()) < 0){
        perror("Failed to fork process");
        return EXIT_FAILURE;
      }

      //child
      if (this_pid == 0){
        printf("CHILD_PROCESS\n");
        // do some interesting stuff here, and then don't forget to
        exit(0);
      }
    }

    if(strcmp(user_input, "QUIT") == 0)
      break;
  }
}