c - 关于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;
}
"/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;
}
如果你像这样从另一个程序运行这个程序:
char*argv[] = {"myprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
以上将输出:
number of arguments: 3
program name: myprog
arg 1: A
arg 2: B
但你也可以像这样运行它
char*argv[] = {"myotherprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
它会输出:
number of arguments: 3
program name: myotherprog
arg 1: A
arg 2: B
您可以使用 的值argv[0]
来了解您的程序是如何被调用的,并且可能会在此基础上公开不同的功能。
流行的busybox工具就是这样做的。单个可执行文件与不同的文件名链接。根据用户用于运行可执行文件的链接,它可以读取argv[0]
以了解它是否被称为ls
、ps
、pwd
等。
推荐阅读
- ffmpeg - 在 264 中的第一个 IDR 之前是什么(不是 sps pps)
- java - 如何找到导致此堆栈溢出错误的行
- python - 在代码中一次安装和导入多个 Python 库
- r - 更改分组条形图中因子的顺序
- java - 使用对象维护哈希图以避免重复的快速方法
- c# - 在 c# 中,'where T : class?' 是什么意思?意思是
- machine-learning - 如何在 Python 中将 Alexnet 的梯度存储为 numpy 数组(在每次迭代中)?
- java - Spring boot 在@MessageMapping 中获取域名
- r - 同时加载多个库
- php - 如何在 PHP 中使用 SMTP 发送电子邮件?