用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容,然后利用wait( )来控制进程执行顺序。
时间: 2023-06-01 22:01:42 浏览: 314
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h>
int main() { pid_t pid;
pid = fork(); // 创建子进程
if (pid < 0) { // 创建失败
fprintf(stderr, "Fork Failed");
exit(-1);
} else if (pid == 0) { // 子进程
printf("Child process executing...\n");
char *args[] = { "./new_program", NULL }; // 新程序的路径
execvp(args[0], args); // 用新程序替换子进程的内容
} else { // 父进程
printf("Parent process waiting for child...\n");
wait(NULL); // 等待子进程完成
printf("Child process completed\n");
}
return 0;
}
相关问题
用 fork()创建一个进程,再调用 exec()用新的程序替换该子进程的内容,利用 wait( ) 来控制 进程执行顺序。
在Unix/Linux操作系统中,fork()
和 exec()
函数组合在一起经常用于创建一个新的子进程并替换其程序。这里是一个简单的示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
// Fork操作
pid_t pid = fork(); // 创建子进程
if (pid == -1) { // 如果fork失败
perror("Fork failed");
return 1;
} else if (pid == 0) { // 子进程
// 执行新程序
char *argv[] = {"ls", "-l", NULL}; // 指定要执行的命令参数
execvp(argv[0], argv); // 使用execvp替换当前进程
perror("Execvp failed");
_exit(EXIT_FAILURE); // 子进程结束,不用wait()
} else { // 父进程
printf("Parent process, child PID is %d\n", pid); // 输出子进程PID
// Wait for the child to finish using wait()
int status;
wait(&status); // 等待子进程结束
if (WIFEXITED(status)) { // 如果子进程正常退出
printf("Child process exited with status %d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) { // 如果子进程被信号中断
printf("Child process terminated by signal %d\n", WTERMSIG(status));
}
}
return 0; // 父进程结束
}
在这个例子中:
fork()
用于创建子进程,如果成功返回的是子进程ID(对于父进程),返回0(对于子进程)。- 在子进程中,
execvp()
函数用于运行指定的新程序,这会替换掉原来的可执行文件及其参数。 - 父进程在等待子进程结束后,通过
wait()
函数接收子进程的状态信息(如退出状态或信号),然后根据这些信息处理子进程的结果。
用 fork( )创建一个进程,再调用 exec( )用新的程序替换该子进程的内容,利用 wait( )来控制进程执行顺序,并分析其结果。
在C语言中,你可以使用fork()
创建一个新的进程,然后使用exec()
函数来替换这个新进程的命令解释器,从而执行全新的程序。这通常用于动态加载和运行新的程序,而无需终止原进程。下面是一个简单的例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
int main() {
pid_t pid;
const char* program[] = {"ls", "-l", NULL}; // 要执行的命令
// 创建子进程
if ((pid = fork()) == -1) {
perror("Failed to fork");
return 1;
} else if (pid == 0) {
// 这是子进程
execvp(program[0], program); // 执行新程序
perror("Failed to execvp");
return 1;
} else {
// 父进程
printf("Parent process ID is %d\n", getpid());
// 使用wait()等待子进程结束
int status;
wait(&status);
printf("Child process with PID %d finished with status %d\n", pid, WEXITSTATUS(status));
}
return 0;
}
在这个程序中,fork()
创建了一个新的子进程,然后在子进程中,execvp()
会替换当前的进程上下文,使得子进程开始执行 ls -l
命令,列出目录内容。父进程则继续执行,等待子进程结束后,通过wait()
获取子进程的状态并打印出来。
运行这个程序,你会看到类似这样的输出:
Parent process ID is [your_pid]
Child process with PID [child_pid] finished with status [exit_status]
这里,exit_status
将根据子进程的实际退出状态有所不同(通常是0表示成功,非零值表示错误)。
相关推荐
















