如何从命令行输入创建子进程
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
$
如果我将此命令输入 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
$