当可执行文件被指定为“ / bin / bash”时,execvp(2)执行什么处理?

时间:2019-07-07 01:50:44

标签: execvp

我知道execvp(2)可以在进程中执行脚本。我遇到了execvp(2)的代码,没有指定的可执行文件?它可以编译并成功运行,但是什么也没做。我不确定它的作用。我以为它只是简单地打开了另一个进程而没有执行任何操作。但是问题是,“ / bin / bash”是可执行文件吗?我认为所有可执行文件都以前缀“ ./”开头,例如“ ./hello”。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  /* exec a shell /bin/bash with no arguments other than its name */
  char *args[] = {"/bin/bash", NULL};
  if (execvp(args[0], args))
    {
    fprintf(stderr, "Failed to exec a shell. \n");
    exit(1);
    }

  return 0;
}

1 个答案:

答案 0 :(得分:0)

  

当可执行文件指定为/bin/bash时,execvp(2)执行什么处理?

/bin/bash被执行。

  

我知道execvp(2)可以在进程中执行脚本。我遇到了execvp(2)的代码,没有指定的可执行文件?

那是不正确的。该代码将/bin/bash指定为可执行文件。

  

它可以编译并成功运行,但是什么也没做。我不确定它会做什么。

它没有做任何“事”。

实际上,它用新的Shell替换了当前进程。现在,您将在命令中键入与先前使用的命令不同的Shell进程。您可以通过多种方式进行确认。例如通过查看ps -efl的输出或在运行C程序之前和之后运行echo $SHLVL

键入exit时,将返回到上一个(父)shell。

  

我以为它只是简单地打开另一个进程,但什么也没做。

只有那样看。见上文。


(您的实际问题是基于对C程序在做什么的误解/误解。)

  

但是问题是,“ / bin / bash”是可执行文件吗?

这取决于您的系统。但是在典型的Linux系统上会如此。

  

我认为所有可执行文件都以前缀“ ./”开头,例如“ ./hello”。

那是不正确的。操作系统根据以下条件决定文件是否为可执行文件:1)文件访问模式(即是否设置了执行权限)和2)文件头确定的文件类型。

您可以通过运行bin/bashls -l /bin/bash来确认file /bin/bash是可执行的。