- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 execl
变体中使用下面的代码,ls
有效,但 ls -l
无效,但在我的 execvp
方法 ls
和 ls-l
有效。我之所以采用 execl
方法是因为二进制文件的路径可能不同,而 execvp
没有为我提供该功能。理想情况下,我希望 execl
也适用于 ls -l
,但现在它不适用于 ls -l
。我尝试阅读手册页,但没有帮助。
void child(int argc, char *argv[MAX_ARGS])
{
execvp(argv[0], argv);
}
void child(char *argv[], char* path)
{
execl(path, argv, NULL);
}
最佳答案
使用execl()
,你必须一个一个地列出参数;仅当您确切地知道要提前执行什么时,它才有用:
execl("/bin/ls", "ls", "-l", (char *)0);
execl("/bin/sh", "sh", "-c", "ls -l", (char *)0);
execl("/bin/ls", "pink elephants", "-l", (char *)0);
等等
如果您不知道必须处理多少参数,请使用 execvp()
或 execv*()
的其他成员之一家庭。另请注意,您必须指定命令的路径; execvp()
会向下搜索 $PATH
,但 execl()
不会。另请注意,您可以选择作为 argv[0]
传递的值。
The reason why I adopted the
execl()
approach is because the path of the binaries could differ whereasexecvp()
did not provide me that feature.
我不确定你在这里的意思。使用 execvp()
,您可以指定:
char *argv[] = { "ls", "-l", 0 };
execvp(argv[0], argv);
execv("/bin/ls", argv);
execvp()
将在 $PATH
上搜索 ls
并执行找到的第一个匹配的程序。第二个将执行 /bin/ls
而根本不查看 $PATH
。
char *argv[] = { "/bin/ls", "-l", 0 };
execv(argv[0], argv);
execvp(argv[0], argv);
这些都行;第二个不会使用基于 PATH 的搜索,因为可执行文件名称 (argv[0]
) 包含斜线。
What confuses me is that in
execvp(argv[0], argv);
why are we passing the entireargv
as the 2nd parameter? So supposeargv[0]
was"ls -l"
, why do we have to pass the entireargv
as the 2nd parameter?
假设 argv[0]
包含 "ls -l"
,你就有问题了。大多数系统没有文件“/bin/ls -l
”或“/usr/bin/ls -l
”(其中空格是名称的一部分) ,但这就是您想要执行的。
exec*()
函数是用于执行进程的低级函数。第一个参数指定要运行的程序(通常是二进制文件;有时是带有 shebang 行的脚本,例如 #!/bin/sh
作为第一行)。在 execv()
或 execvp()
或 execve()
或 execvpe()
的情况下,第二个argument 是参数 vector ,就像 main()
函数接收参数 vector (或参数 vector ,因此 argv
)。这是程序参数的空终止列表。如果要使用选项 -l
执行 ls
命令,则需要在 argv
中指定三个(!)值 "ls"
, "-l"
和一个空指针:
char argv[] = { "ls", "-l", 0 };
使用 execl*()
函数,您可以将要运行的程序指定为第一个参数,然后是写出的参数 vector :
execl("/bin/ls", "ls", "-l", (char *)0);
如果你有 10 个参数,你必须写出 10 个参数(加上空指针)。
在 exec*()
函数中,名称包含:
l
— 列出格式参数v
— vector 格式参数p
— 对程序进行 PATH 查找(如果给定名称不包含斜杠)e
— 也采用环境变量 vector 这些结合起来:
execl()
execv()
execlp()
execle()
execvp()
execve()
没有 execlpe()
和 execvpe()
有时会有点令人讨厌(但请参阅 Linux 扩展 execvpe(3)
)。 man 2 exec
页面的传统做法是从概要中省略其中一些内容,但在手册页的正文中提及它们——这一传统/遗产至少可以追溯到第 7 版 UNIX™ 1979 年(并且至少持续到 RHEL 5 Linux 和 Mac OS X 10.7.5;man 2 execl
页面提到了 execve()
但没有在概要部分列出它).其他 exec*()
函数都可以构建在 execve()
之上——这是集合中的基本函数(在 Linux 手册中列为 execve(2)
结果)。
关于诸如 "ls -l"之类的命令未在 execl 中执行,而在 execvp 中它有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017102/
如果我执行 ls -la,我会得到如下结果 total 16 drwxr-xr-x 4 rockse staff 136 Apr 28 16:55 . drwx------+ 23 rocks
我找到了一些Linux文件,当我键入ls -lah时,它将输出以下权限格式: ... drwxr-xr-x. 2 root root ... -rw-rw-r--. 1 root r
我正在尝试从 python 执行 ls -l 来检查文件的最后修改日期。 os.listdir 不显示长列表格式。subprocess.call 显示格式,但实际上打印它,并返回 0。我希望能够将其放
以下 shell 函数定义卡在 Cygwin 的 bash 控制台 (RHEL/Ubuntu) 中,当它被调用时它只是退出终端。 $ function ls { ls; } $ ls 为什么会出现这种
为什么这两个命令的输出不同: ls | cat ls 第一个似乎用换行符分隔文件名。 这也适用于命令 suc 有 ls > outfile 和类似的东西。 我使用的是 Mac OSX,如果这有什么不同
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我使用 eshell-parse-command 'ls -l' 得到了这个: (progn (eshell-trap-errors (eshell-named-command "l
如何使用 RegExp 在 JavaScript 中实现类似于 alias 的功能? ALIAS = [{pattern: /^ls[$ ]/, replace: 'ls --color '}] s
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在编写一个 shell 程序,当将值传递给 execv() 时,我需要一个指向程序名称的 char 指针(即 ls),我需要一个指向参数的 char 指针数组的指针。 我会检查并解析用户的输入,如
我对使用 bash 编写脚本还比较陌生,并编写了以下脚本: # Set variables logfile=/tmp/peter/logfile.log indir=/mls/indir/IG/ te
所以基本上我有一个任务要使用 strace 进行分析,ls 命令需要哪些系统调用才能提供与 ls -l 相同的信息。 但是对于 ls -l 命令有许多奇怪的系统调用,例如 stat 64 被调用时使用
我在 ubuntu 的文件夹中有一个文件夹列表。IE。/mnt/source/customcode/files/brands/下 root@a919794ec280:/mnt/source/custo
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
#include #include #include #include #include int flag; void catch (int sig) { if (sig == SIGI
我使用 Process 来调用 shell(zsh),我想 cd ~ 或其他一些目录,例如在 shell 中定义的 cd $PROJ_ROOT。但似乎无法处理这些 token 。如何解决这个问题? s
我在我的 Centos5 机器上运行了这个: ls -al & ; ls -al 我期待它在后台运行 ls -al,同时在前台运行 ls -al,并演示终端的输出是如何被破坏的通过这样做。 但是,我得
当我在 PowerShell 中使用 Get-ChildItem 时,我会得到目录中以行格式设置的项目列表。该列表经常会超出屏幕,如果我想查看列表的其余部分或以前的命令和输出,则迫使我向上滚动。我想为
我试图用所有必要的参数绕过调用 JNIEnv->DefineClass 方法,但当我尝试从 java 调用该方法时,它总是返回 java.lang.NoClassDefFoundError: ls.H
我是一名优秀的程序员,十分优秀!