命令“/bin/sh -c ls /”和sh temp.sh(仅包含一行ls /)在进程和子进程的视图上有什么区别吗?

命令“/bin/sh -c ls /”和sh temp.sh(仅包含一行ls /)在进程和子进程的视图上有什么区别吗?

上面的执行命令的方式和下面的代码有什么区别? #include int main ( ) { int return_value; return_value = system ( "ls /" ); return return_value; }

答案1

system("ls /")将生成一个sh进程,并为其提供参数-cls /。因此,运行程序和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

相关内容