And*_*che 5 c linux fork argv execve
我有一个由我的教授编写的程序,该程序使用来打印工作目录(pwd)execve(),但是我不理解这些参数。
pid_t pid = fork();
if(pid <0)
perror(NULL);
else if(pid == 0)
{
char*argv[] = {"pwd",NULL};
execve("/bin/pwd",argv,NULL);
perror(NULL);
}
else
printf("Im the parent!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
"/bin/pwd" 给出将要执行的可执行文件的路径。
这意味着它将调用该pwd函数,不是吗?那为什么我需要参数 pwd呢?
没有该参数程序是否无法运行?
按照约定,传递给程序的第一个参数是可执行文件的文件名。然而,这并不一定是必须的。
以以下程序为例:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("number of arguments: %d\n", argc);
printf("program name: %s\n", argv[0]);
for (i=1; i<argc; i++) {
printf("arg %d: %s\n", argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您从另一个程序运行此程序,如下所示:
char*argv[] = {"myprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
Run Code Online (Sandbox Code Playgroud)
上面将输出:
number of arguments: 3
program name: myprog
arg 1: A
arg 2: B
Run Code Online (Sandbox Code Playgroud)
但你也可以这样运行
char*argv[] = {"myotherprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
Run Code Online (Sandbox Code Playgroud)
它会输出:
number of arguments: 3
program name: myotherprog
arg 1: A
arg 2: B
Run Code Online (Sandbox Code Playgroud)
您可以使用 的值argv[0]来了解您的程序是如何被调用的,并可能基于此公开不同的功能。
流行的busybox工具就是这样做的。单个可执行文件与不同的文件名链接。根据用户用于运行可执行文件的链接,它可以读取argv[0]以了解它是否被称为ls、ps、pwd等。