使用 execl 命令

use*_*751 5 c linux signals

我试图了解 execl 命令的各个部分。我是 C 编程新手,对 linux 不太熟悉。我被告知使用这个命令执行几个语句,在大多数情况下我想我理解它。

execl(location here, followed by arguments, terminated by a null pointer)

我的任务是使用此命令执行以下操作:

  • 进程状态树,ps --forest

    execl("/bin/ps", "ps", "--forest", (char*) NULL); 这有效

  • 日期和时间,日期

    execl("/bin/date", "date", 0, (char*) NULL); 这有效。

  • “财富”命令

    execl("/usr/bin/fortune", "fortune", (char*) NULL); 这不起作用。

    execl("/bin/fortune", "fortune", (char*) NULL); 这不起作用。

Fortune 命令的主要问题是我要么缺少参数,要么位置错误。我假设它是位置,因为我可以在命令行中使用“fortune”来执行它。我已经搜索了正确的位置,但找不到任何提及。

编辑:多亏了 ojblass,位置被验证为“/usr/bin/fortune”,这意味着我的论点一定不正确。

  • 长目录列表代码

    execl("/usr/bin/find", "find", "/", "-name", "date", "-maxdepth", "3", "2>", "/dev/null", (char *)NULL); 这不起作用。

编辑:改为: execl("/usr/bin/find", "find", "/", "-name", "date", "-maxdepth", "3", "2>/dev/null", (char *)NULL);

这应该从根目录的最大深度为 3 处找到具有给定名称的文件,然后将所有错误消息发送到 /dev/null。我对这个命令很迷茫。

  • 将信号处理程序安装为用于捕获信号的代码的代码。

对于这个,我不确定如何处理,但我知道我需要接受他们提供的参数,然后将其传递给我创建的处理程序。所以像:

`execl("/bin/I don't know this part maybe 'signal'?",cmd[1], (char*) NULL);`
Run Code Online (Sandbox Code Playgroud)

然后传入 signal(cmd[1], sighandler);

写完这篇文章后,我会说我主要努力的部分是理解命令而不是 execl() 的使用。

如果您可以纠正我搞砸的任何地方,或者对命令进行解释,那将不胜感激!

谢谢!

编辑:解决方案已发布在评论中。

小智 3

尝试改用 execlp,它会在 PATH 环境变量指定的目录中搜索可执行文件:

execlp("fortune","fortune",(char*)NULL);
Run Code Online (Sandbox Code Playgroud)

execlp 的第一个参数是可执行文件的名称。其余的是传递给 char *argv[] 的参数,以 NULL 指针终止(第一个是程序的名称)。