分别用execlp()、execl()和execv()函数实现命令“find / -name abc”的功能
时间: 2024-10-29 11:15:03 浏览: 14
在Unix/Linux系统中,`execlp()`, `execl()` 和 `execv()` 都是用于执行外部程序的库函数,它们的区别在于处理路径和参数的方式:
1. **execlp()**: 这是最安全的版本,它会自动查找指定的绝对路径程序并执行。例如,如果你想要运行 "find / -name abc",你可以这样做:
```c
#include <unistd.h>
int main(int argc, char *argv[]) {
execlp("find", "find", "/","-name", "abc", NULL);
// 如果 find 可用,程序将立即停止,并返回非零退出状态
perror("Failed to execute find");
return -1;
}
```
这里 `"find"` 是程序名,后面的参数列表按照实际命令执行的顺序传递。
2. **execl()**: 这个函数也需要提供完整路径,但它不会检查路径是否存在或权限是否足够。因此风险更大一些:
```c
execl("/usr/bin/find", "find", "/","-name", "abc", NULL);
```
3. **execv()**: 它接受的是一个指向字符串数组的指针,包含完整的命令行及其参数。你需要手动构建这个字符串数组,比如:
```c
char *cmd[] = {"find", "/", "-name", "abc", NULL};
execv(cmd[0], cmd); // 使用第一个元素作为程序名,其余作为参数
```
注意:这些函数都会替换当前进程,也就是说如果执行成功,原有的main函数会终止,控制权转交给新执行的程序。
阅读全文