如何从命令行输入创建子进程

How can I create a child process from a command line input

如果我将此命令输入 Linux 终端,假设 ./loop 是我编译的 C 程序。 (./loop 只是一个打印 'hello world' n 次的程序)

$time ./loop 8

我正在寻找 ./loop 8 的命令行输入,并将其调用传递给新的子进程,而不是让原始进程 运行 它。因此进程 time 将不得不等待子进程的终止(即 ./loop)。

我对 fork() 和 exec()(以及 C 语言编程 :b)的整体还很陌生,所以想知道如何获取命令行参数并将命令作为新命令启动子进程?

编辑:这是可能的解决方案吗?

int main(int argc, char *argv[]) {
    pid_t pid = fork()
    if (pid < 0)
    {
      return -1;
    }
    else if(pid = 0 ){
      printf("i am a child process, with pid: %d\n", (int)getpid());
      int execvp(char *argv[0], char *argv[1]);
      exit(0);
    }
    else{
      printf("i am parent ");
      int status ;
      pid_t child_pid;
      child_pid = wait4(pid, &status, 0)
//print the exit statment 
//prirnt the exit stats (ie. run time, etc.)
      
    }
}

如果我没理解错的话,您正在寻找这样的东西(它还没有对 rusage 做任何事情,但请随意)。 (此外,没有边界检查。请小心。)

需要了解的重要一点是,子进程 成为 execvp 执行的进程,并且不会启动自己的新子进程。

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


int main(int argc, char *argv[]) {
  pid_t pid = fork();
  if (pid < 0) {
    perror("fork failed");
    return 1;
  } else if (pid == 0) {
    printf("i am a child process, with pid: %d\n", (int)getpid());
    execvp(argv[1], argv + 1);
    // This can only be reached if execvp returns (i.e. fails to exec)
    perror("execvp failed");
    exit(123);
  }
  printf("i am parent of %d\n", pid);
  int status; 
  struct rusage ru;
  pid_t child_pid = wait4(pid, &status, 0, &ru);
  if(child_pid < 0) {
    perror("wait4 failed");
  } else {
    printf("child exited with %d\n", status);
  }
  exit(0);
}

示例:

$ clang -o forky -Wall forky.c
$ ./forky /bin/echo hello
i am parent of 11522
i am a child process, with pid: 11522
hello
child exited with 0
$