上面的执行命令的方式和下面的代码有什么区别?
#include int main ( ) { int return_value; return_value = system ( "ls /" ); return return_value; }
答案1
system("ls /")
将生成一个sh
进程,并为其提供参数-c
和ls /
。因此,运行程序和sh -c "ls /"
在 shell 中键入之间的主要区别在于,在第一种情况下,还有一个包含程序的进程。因此,如果您可以在ls
运行时捕获进程树,您将看到类似以下内容:
init───konsole───bash───myprog───sh───ls
代替
init───konsole───bash───sh───ls
如果您使用了函数系列之一exec
,则可以完全避免使用sh
,并用实用程序替换您的程序ls
。在这种情况下,您将看到:
init───konsole───bash───ls
该程序可能看起来像这样:
int main(int argc, char** argv) {
return execlp("ls", "ls", "/");
}
bash
如果通过选项执行的命令是简单命令,许多 shell(包括)都会自动执行此-c
操作。即便如此,为了用您可以直接执行的进程替换 shell 而生成 shell 也没有什么意义exec
。
除了打开文件进行读取所需的内容外,sh -c "ls -l"
和之间几乎没有区别。sh ls-l.sh