我在同一个目录中有两个文件。
directory/
| a.c
| b.c
Run Code Online (Sandbox Code Playgroud)
交流电
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
int status;
int wret;
if ((pid = fork()) < 0)
printf("error");
else if(pid == 0)
{
printf("%s", argv[1]);
execv(argv[1], &argv[1]);
}
else
{
/* respawn */
if ((wret = wait(&status)) != -1)
execv(argv[1], &argv[1]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
bc 只是一个打印“hello”的简单程序。
我想从命令行运行./a b以进行a程序调用exexXX以执行b程序。
我不明白为什么如果我使用execv我只能./a b在命令行中写,而不是如果我使用execvp我必须写./a ./b.
该man exec页面目前尚不清楚,因为它会报告
“这些函数的初始参数是要执行的文件的名称。”
谢谢
如果程序名称参数不包含斜杠,则该execvp()函数会在 PATH 环境变量中列出的目录中查找要执行的程序。如果您.的 PATH 上没有(当前目录)并且您不在路径中列出的目录之一中b,那么即使b在当前目录中,也不会执行像这样的普通名称。如果名称包含斜杠,则它可以是相对 ( ./b) 或绝对 ( /home/someone/src/programs/b),它将被解释为要执行的文件名,而无需咨询 PATH 环境变量。
相比之下,execv()将b程序名称参数中的普通视为./b- 当前目录中文件的名称,如果存在则执行它,如果它位于其他地方则失败。
有一次,有一条评论问:
你是说如果你有一个可执行文件 b
.并且你做了execv("b", b_args),它会被执行吗?
在普通的 Unix 机器上,是的。
代码b.c:
#include <stdio.h>
int main(void)
{
puts("Hello");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码a.c:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char *argv[] = { "b", 0 };
execv(argv[0], argv);
fprintf(stderr, "failed to execute '%s'\n", argv[0]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
运行这些:
$ (PATH=$(clnpath "$PATH" ".:$PWD"); echopath PATH; ./a)
/Users/jleffler/bin
/opt/informix/12.10.FC6/bin
/Users/jleffler/oss/bin
/Users/jleffler/oss/rcs/bin
/usr/local/mysql/bin
/opt/gcc/v7.3.0/bin
/Users/jleffler/perl/v5.24.0/bin
/usr/local/bin
/usr/bin
/bin
/opt/gnu/bin
/usr/sbin
/sbin
Hello
$
Run Code Online (Sandbox Code Playgroud)
该clnpath脚本"$PATH"通过删除任何出现在其第二个类似路径的参数 ( ".:$PWD") 中列出的任何目录名称来修改作为其第一个参数 ( )提供的字符串— 这就是我在需要时即时编辑 PATH 的方式。该echopath脚本回显目录PATH(或任何其他类似路径的变量,或者它将处理扩展类似路径的变量的结果,例如"$PATH"),每行一个 - 输出显示既不是.也不是/Users/jleffler/soq(这是我运行程序的地方)是$PATH在子shell。的./a运行从代码a.c(它不会被不被执行./前),这反过来从运行的代码b.c,其产生Hello. (如果有一些系统不工作,请识别它。)
我也可以安排为b.c:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
puts("Hello");
const char *env = "PATH";
char *val = getenv(env);
if (val == 0)
val = "<nothing>";
printf("%s=%s\n", env, val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将$PATH直接从可执行文件打印 的值(以验证.当前工作目录的值和值都未列出)。
| 归档时间: |
|
| 查看次数: |
9816 次 |
| 最近记录: |