system() 和 execl() 调用之间的区别
system() 调用是程序与操作系统交互的一种方式。它用于在进程中执行命令。系统调用通过应用程序接口(API)向用户程序提供操作系统的服务。它提供进程和操作系统之间的接口,它不会替换当前进程的映像。
句法:
#include
#include
int system(const char *command);
下面是实现 system() 的 C 程序。
C
// C program to implement
// system()
#include
#include
int main()
{
printf("step before system call\n");
system("ps");
printf("step after system call\n");
}
C
// C program to implement
// execl()
#include
#include
int main()
{
printf("step before execl call\n");
execl("/bin/ps", "ps", NULL);
printf("step after execl call");
}
输出:
execl() 调用用路径指定的新进程映像替换当前进程的映像,即当前进程代码被新进程代码替换。
句法:
#include
#include
int execl(const char *path, const char *arg, . . . /* (char *) NULL */);
下面是实现 execl() 的 C 程序。
C
// C program to implement
// execl()
#include
#include
int main()
{
printf("step before execl call\n");
execl("/bin/ps", "ps", NULL);
printf("step after execl call");
}
输出:
system() 和 execl() 调用的工作差异
在 system() 调用中:
- 代码 system() 不会替换当前进程的映像,即 a.out。
- 因此,第一个语句被打印,即“系统调用之前的步骤”,另一个进程 ps 是使用 system() 调用创建的,该调用继续独立打印 ps 命令的输出,而 a.out 也继续并使用第二个 printf() 语句进行打印即“系统调用后的步骤”。
- 从 out of ps 命令可以看出,有两个进程 a.out(PID 为 2556)和 ps(PID 为 2558)。
在 execl() 调用中:
- 语句 printf(“执行前的步骤\n”);被打印,然后调用 execl() 用新进程(即 ps)替换当前进程映像。
- 因此,打印的是 ps 命令的输出,而不是第二个 printf() 语句。
- ps 的输出还只显示了 ps 的条目,而不显示 a.out(原始进程),因为 a.out 的图像被 ps 进程的图像替换。
系统()与执行() It takes two arguments:S No. system() execl() 1. system() call creates a new process. execl() call does not create a new process. 2. It does not replace the image of the current process. It replaces the image of the current process. 3. System call provides an interface between a process and an operating system. It return any value. 4. System calls are available as assembly language instructions. 5. System calls are made when a process in user mode requires access to a resource. It loads the program into the current process space and runs it from the entry point.