作者andytzeng (Ya-Shiuan)
看板LinuxDev
标题Re: 请问...execlp 指令 的意义
时间Sun Jun 3 11:04:49 2007
※ 引述《ariesgolem (继续努力就会成功)》之铭言:
: execlp("/bin/ls", ls, NULL);
: 请问...当我下这行指令...
: 第一个是path...为 /bin/ls
: 第二个参数...的 ls 指的是档名吗!?
要这麽说也可以..
你用 C 语言 跑下面简单的 case
#include <stdio.h>
int main(int argc, char **argv)
{
printf("==>%s\n", argv[0]);
}
在不同的路径执行就会有不同的结果
假设我将编译完档案放在 /tmp/a.out
/$ tmp/a.out
==>tmp/a.out
/tmp$ ./a.out
==>./a.out
/tmp$ /tmp/a.out
==>/tmp/a.out
一般 shell 都会帮你把「执行的路径」塞入第一个参数,所以用第一个参数
可以抓到执行时使用的路径,进而判断原本执行时的 location 在哪儿
同理,execlp 的第一个参数给的只是惯用性的执行路径,但没有一定要给
视呼叫的对象而定,举个例子.
//====================aa.c===================
// aa.c
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
if (pid == 0) {
execlp("./b.out", NULL);
printf("error\n");
exit(-1);
}
else if (pid < 0) {
perror("fork");
exit(1);
}
pid = fork();
if (pid == 0) {
execlp("./b.out", "./b.out", NULL);
exit(-1);
}
else if (pid < 0) {
perror("fork");
exit(2);
}
pid = fork();
if (pid == 0) {
execlp("./b.out", "hello", NULL);
exit(-1);
}
else if (pid < 0) {
perror("fork");
exit(2);
}
exit(0);
}
//====================bb.c===================
//bb.c
//gcc bb.c -o b.out
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
pid_t pid = getpid();
if (argv[0]) {
printf("[%d] => %s\n", pid, argv[0]);
}
else {
printf("[%d] => no argv[0]\n", pid);
}
}
各编译成
a.out, b.out 放在同一路径下执行 a.out
[3389] => no argv[0]
[3390] => ./b.out
[3391] => hello
在第一个 if-else 中,我使用 execlp 并没有传入第一个参数,所以得到
第一行结果,b.out 输出 no argv 的讯息
第二个 if-else 就是常用的作法,得到执行路径
第三个 if-else 是我恶搞的作法,随意传入一个字串,这时在 b.out 输出
argv[0] 就会得到这字串了...
当然直接执行 b.out 也会得到第二行的结果,因为这是 shell 一般的作法
至於为什麽说看对象而定呢,因为有些程式会看 argv[0] 传入的字串来决定
内部要什麽的 execution flow 是哪一条,很多系统程式都有这种特性,如
ls -l /usr/bin/reboot /usr/bin/poweroff
lrwxrwxrwx 1 root root 13 12月 29 01:48
/usr/bin/poweroff -> consolehelper
lrwxrwxrwx 1 root root 13 12月 29 01:48
/usr/bin/reboot -> consolehelper
一般情况 reboot, poweroff 系统会有不同的行为出现,但都是同一只程式
所为,大概就是利用这方法吧
此外有些程式也会利用 argv[0] 来检查有没有被恶搞..
--
有错误请多指教..
thanks a lot
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.214.90
※ 编辑: andytzeng 来自: 140.113.214.90 (06/03 11:06)
1F:推 ariesgolem:感谢回应 感谢回应 06/03 21:19
2F:推 wlsabcd:good....good... 06/03 22:20
3F:推 yhuiyang:嗯,symbolic link 的 busybox 也是一例... 06/04 23:07
4F:→ andytzeng:耶..对耶...竟然忘记 busybox 这超有名的例子.. 06/05 09:03
5F:→ andytzeng:感谢 y 大点醒 06/05 09:03