我知道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;
}
答案 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/bash
和ls -l /bin/bash
来确认file /bin/bash
是可执行的。