当前位置: 首页 > 面试题库 >

我不明白execlp()在Linux中的工作方式

陆俊捷
2023-03-14
问题内容

我已经花了最后两天的时间来理解execlp()系统调用,但是我仍然在这里。让我直接谈谈这个问题。

man pageexeclp的声明系统调用为int execlp(const char *file, const char *arg, ...);与描述: 该为const char
ARG和随后的椭圆在execl的(),execlp()和execle()函数可以作为为arg0,ARG1,…,ARGN被认为。

但是,我在课本中看到这样的系统调用:(execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);
…”是我们作为学生来识别的)。但是,此系统调用甚至与系统调用上的声明都不相似man page

我很困惑。任何帮助表示赞赏。


问题答案:

这个原型:

  int execlp(const char *file, const char *arg, ...);

说execlp是一个变量参数函数。这需要2 const char *。其余的参数(如果有的话)是要移交给我们要运行的程序的其他参数-而且char *-所有这些都是C字符串(最后一个参数必须是NULL指针)

因此,该file参数是要执行的可执行文件的路径名。arg是我们希望argv[0]在可执行文件中显示的字符串。按照惯例,argv[0]只是可执行文件的文件名,通常将其设置为与相同file

...现在的其他参数给予可执行文件。

假设您是从命令行/ shell运行的:

$ ls

那将是execlp("ls", "ls", (char *)NULL); 或者如果您跑步

$ ls -l /

那会是 execlp("ls", "ls", "-l", "/", (char *)NULL);

如此下去 execlp("/bin/sh", ..., "ls -l /bin/??", ...);

在这里,您将转到外壳程序/ bin / sh,并向外壳程序执行命令。该命令是“ ls -l / bin / ??”。您可以从命令行/
shell手动运行该命令:

 $ ls -l /bin/??

现在,如何运行shell并告诉它执行命令?您打开外壳的文档/手册页并阅读。

您要运行的是:

$ /bin/sh -c "ls -l /bin/??"

这变成

  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

旁注:/bin/??正在进行模式匹配,该模式匹配由外壳程序完成,并且扩展到/ bin /下的所有文件(具有2个字符)。如果你只是做了

  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

可能什么也不会发生(除非实际上有一个文件名为/bin/??),因为没有解释和扩展/ bin / ??的shell。



 类似资料:
  • 下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛

  • ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 为什么会这样?因为我指定了在不满足任何条件的情况下分配给列的值。

  • 还不起作用。所以我放弃链接,我只是编码:

  • 我需要改变复选框检查状态,但useCallback重新呈现组件很多次。我不明白它是如何工作的。我读过很多关于它的材料。 重新渲染的数量:

  • 我正在Celero git存储库中检查DoNotOptimizeAway的含义。但我还是不明白。请你用外行的话帮我理解一下好吗。尽你所能。

  • 问题内容: 我对Angular中的注入感到非常困惑。我不知道在哪里使用它以及为什么。是否仅按此处所述与工厂一起使用? 这是工厂的名称。 问题答案: 这是在代码最小化后(如果选择最小化)支持依赖注入的一种方法。 声明控制器时,该函数采用参数: 压缩代码时,您的函数将如下所示: 由于AngularJS使用函数参数名称来推断DI,因此您的代码会中断,因为AngularJS不了解或。 为了解决此问题,他们