📜  system() 和 execl() 调用之间的区别

📅  最后修改于: 2022-05-13 01:55:30.544000             🧑  作者: Mango

system() 和 execl() 调用之间的区别

system() 调用是程序与操作系统交互的一种方式。它用于在进程中执行命令。系统调用通过应用程序接口(API)向用户程序提供操作系统的服务。它提供进程和操作系统之间的接口,它不会替换当前进程的映像。

句法:

下面是实现 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() 调用用路径指定的新进程映像替换当前进程的映像,即当前进程代码被新进程代码替换。

句法:

下面是实现 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");
}

输出:

输出 execl()

system() 和 execl() 调用的工作差异

在 system() 调用中:

  1. 代码 system() 不会替换当前进程的映像,即 a.out。
  2. 因此,第一个语句被打印,即“系统调用之前的步骤”,另一个进程 ps 是使用 system() 调用创建的,该调用继续独立打印 ps 命令的输出,而 a.out 也继续并使用第二个 printf() 语句进行打印即“系统调用后的步骤”。
  3. 从 out of ps 命令可以看出,有两个进程 a.out(PID 为 2556)和 ps(PID 为 2558)。

在 execl() 调用中:

  1. 语句 printf(“执行前的步骤\n”);被打印,然后调用 execl() 用新进程(即 ps)替换当前进程映像。
  2. 因此,打印的是 ps 命令的输出,而不是第二个 printf() 语句。
  3. ps 的输出还只显示了 ps 的条目,而不显示 a.out(原始进程),因为 a.out 的图像被 ps 进程的图像替换。

系统()与执行()

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.

It takes two arguments:

  1. The path of the file to execute.
  2. Pointers to NULL-terminated character strings
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.