这应该算是老生长谈的问题了,在此做一个记录。
执行exec()后,老的进程上下文将被exec出来的新的进程上下文覆盖,新进程代替原进程执行。
执行system()后则相当于fork()出一个子进程,并等待此子进程执行完毕。
请看如下程序以加深理解。
- /* rt.c */
- int main()
- {
- return 100;
- }
#gcc rt.c -o rt
- /* test.c */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include <stdlib.h>
- int main()
- {
- char *argv[] = {NULL};
- char *envp[] = {NULL};
- int ret_stat = 0;
- int pid = fork();
- if (pid == 0) {
- printf("child: pid %d\n", getpid());
- //execve("./rt", argv, envp);
- execve("./rtabc", argv, envp);
- //system("./rt");
- exit(127);
- }
- else if (pid > 0 ) {
- printf("parent: child pid is %d\n", pid);
- if (waitpid(pid, &ret_stat, 0) != pid) {
- printf("waitpid failed, ret_stat is %d\n", ret_stat);
- }
- else {
- printf("waitpid success, ret_stat is %d\n", ret_stat);
- printf("WIFEXITED(ret_stat): %d; WEXITSTATUS(ret_stat): %d;", WIFEXITED(ret_stat), WEXITSTATUS(ret_stat));
- }
- }
- else if (pid < 0) {
- printf("fork() error !\n");
- exit(-1);
- }
- return 0;
- }
宏WIFEXITED用于判断进程是否正常退出。
宏WEXITSTATUS用于得到进程的退出状态码。
分别使用execve()和system()函数来测试进程的返回值。
问:在列出的3种情况下,进程的返回值分别是什么?
1.使用execve("./rt", argv, envp);
返回值为100,execve()后的exit(127)永远都不会走到。
2.使用execve("./rtabc", argv, envp);
rtabc是一个并不存在的程序。
此时execve()函数将会执行失败。
最后进程返回127。
3.使用system("./rt");
进程返回127。