中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
execl(/bin/more, /more,(char *)0);请问,第二个/more什么意思!
作者:未知 时间:2005-09-13 19:26 出处:ChinaUnix.net 责编:chinaitpower
              摘要:execl(/bin/more, /more,(char *)0);请问,第二个/more什么意思!

execl(/bin/more, /more,(char *)0);请问,第二个/more什么意思!
还有,请问那边有exec函数的详细介绍,谢谢!(man 看起来太费力)

【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭
 lenovo 回复于:2003-12-21 10:20:02
《unix高级编程环境》

 forest077 回复于:2003-12-23 19:08:42
[quote:44fdf03c77="lenovo"]《unix高级编程环境》[/quote:44fdf03c77]
错了,是《unix环境高级编程》。这本书真是unix编程的宝典啊。宝典中的经典。

 win_hate 回复于:2003-12-23 20:19:00
[quote:d8fc09fc5f="shxliang"]execl(/bin/more, /more,(char *)0);请问,第二个/more什么意思!
还有,请问那边有exec函数的详细介绍,谢谢!(man 看起来太费力)[/quote:d8fc09fc5f]

这个写法是错的哦。 :D

 devel 回复于:2003-12-23 22:29:21
格式是这样

#include <process.h>
                                                                                
int execl( const char * path,
           const char * arg0,
           const char * arg1...,
           const char * argn,
           NULL );

 shxliang 回复于:2003-12-29 11:39:40
[quote:520e38c788="win_hate"]

这个写法是错的哦。 :D[/quote:520e38c788]
但是,能用哦,所以我在郁闷,’/more‘到底是干啥的,我用其他任意字符都好象可以,这个参数到底起什么作用。

 flw 回复于:2003-12-29 11:49:44
[quote:de3fb21ef2="shxliang"]但是,能用哦,所以我在郁闷,’/more‘到底是干啥的,我用其他任意字符都好象可以,这个参数到底起什么作用。[/quote:de3fb21ef2]
能用个头,能用是假的。
连引号都没有。

 shxliang 回复于:2003-12-29 11:57:24
不好意思,在windows下输的,输错了,不好意思。

 lenovo 回复于:2003-12-29 11:58:23
[quote:a1517a8fa8="flw"]
能用个头,能用是假的。
连引号都没有。[/quote:a1517a8fa8]
哈哈,笑死我了,斑竹说话越来越有意思了。 :D  :D  :D

 shxliang 回复于:2003-12-29 11:58:33
不好意思,在windows下输的,输错了,不好意思。
应该是 execl("/bin/more"," /more",(char *)0);

 JohnBull 回复于:2003-12-29 12:00:18
就是为了伪装argv[0],让它不能反映程序的真是位置而已.

 shxliang 回复于:2003-12-29 12:14:43
太失败了,呜呜.....
不过谢谢各位了!

 flw 回复于:2003-12-29 12:24:09
[quote:adb7c140e7="lenovo"]哈哈,笑死我了,斑竹说话越来越有意思了。 :D  :D  :D[/quote:adb7c140e7]
呵呵,最近我年轻了 30 岁。 :lol:  :lol:  :lol:

 shxliang 回复于:2003-12-29 12:29:24
[quote:8bf4ee9a8c="JohnBull"]荒芊从吵绦虻恼媸俏恢枚?[/quote:8bf4ee9a8c]
对了,那儿有详细介绍啊!
给个链接吧!
谢谢!

 蓝色键盘 回复于:2003-12-29 15:27:55
/bin//ls
执行的结果和/bin/ls是一样的
多拼一个/能够执行

 shxliang 回复于:2003-12-30 09:35:37
为什么,到底如何理解,请指教

 fieryfox 回复于:2003-12-30 10:28:14
第二个是shell传递给/bin/more的argv[0]的内容。

 蓝色键盘 回复于:2003-12-30 11:35:16
楼主想知道具体原因,不知道其他系统是怎么实现execve的,我看了看linux的。从linux中看到的结果从某个方面可以说明类似的问题。

我看到的源代码OS版本是
!uname -a
Linux db4.localdomain 2.4.20-8smp #1 SMP È& 7Ô 23 8:58:25 CST 2003 i686 i686 i386 GNU/Linux

和exec相关的有两大块,一是arch下面,主要是控制不同体系结构上的差异。另外一个是fs目录,主要是exec.c。

函数do_execve是执行exec系列函数的入口,这个函数代码比较少,可以看看。

[code:1:c10dec9753]
int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
{
struct linux_binprm bprm;
struct file *file;
int retval;
int i;

file = open_exec(filename);

retval = PTR_ERR(file);
if (IS_ERR(file))
return retval;

bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0])); 

bprm.file = file;
bprm.filename = filename;
bprm.sh_bang = 0;
bprm.loader = 0;
bprm.exec = 0;
if ((bprm.argc = count(argv, bprm.p / sizeof(void *))) < 0) {
allow_write_access(file);
fput(file);
return bprm.argc;
}

if ((bprm.envc = count(envp, bprm.p / sizeof(void *))) < 0) {
allow_write_access(file);
fput(file);
return bprm.envc;
}

retval = prepare_binprm(&bprm);
if (retval < 0) 
goto out; 

retval = copy_strings_kernel(1, &bprm.filename, &bprm);
if (retval < 0) 
goto out; 

bprm.exec = bprm.p;
retval = copy_strings(bprm.envc, envp, &bprm);
if (retval < 0) 
goto out; 

retval = copy_strings(bprm.argc, argv, &bprm);
if (retval < 0) 
goto out; 

retval = search_binary_handler(&bprm,regs);
if (retval >= 0)
/* execve success */
return retval;

out:
/* Something went wrong, return the inode and free the argument pages*/
allow_write_access(bprm.file);
if (bprm.file)
fput(bprm.file);

for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
struct page * page = bprm.page[i];
if (page)
__free_page(page);
}

return retval;
}
[/code:1:c10dec9753]
这个函数相关两个重要的数据结构,一个是第一局定义
struct linux_binprm bprm;
结构linux_binprm可以参看头文件,主要保存运行程序的参数和框架。
还有一个是pt_regs ,主要存储调用时候的寄存器信息。

这个函数大体上完成了如下功能:
1、open_exec初始化文件。
2、检查和设置参数,并且清除页表
3、调用prepare_binprm检查文件类型。文件全县还有文件状态(例如是否处于修改状态),设置uid和gid等
4、调用copy_strings(),这个是我们分析的重点。
5、调用search_binary_handler,这函数负责查找可执行文件的格式

同一个文件中copy_strings()
while(1)中
[code:1:c10dec9753]
int copy_strings(int argc,char ** argv, struct linux_binprm *bprm)
{
        struct page *kmapped_page = NULL;
        char *kaddr = NULL;
        int ret;

        while (argc-- > 0) {
                char *str;
                int len;
                unsigned long pos;

                if (get_user(str, argv+argc) ||
                                !(len = strnlen_user(str, bprm->p))) {
                        ret = -EFAULT;
                        goto out;
                }

[/code:1:c10dec9753]
从如上的代码get_user处可以看出来,的确copy了argv的最后一个符号到str,后面的代码北配好空间后
     err = ll_copy_from_user(kaddr+offset, str, bytes_to_copy
这时候执行的用户空间串便是str。

看看楼主的问题,最后copy到核心的是多了一个'/'. (/bin/more//more)


如有错误,请各位指正。

 win_hate 回复于:2003-12-30 13:44:57
[quote:88c8b2e922="蓝色键盘"]
看看楼主的问题,最后copy到核心的是多了一个'/'. (/bin/more//more)
..........[/quote:88c8b2e922]

的确如此,execl ("/bin/maor", "/more" ...); 中,第二个 "/more" 被原封不动地传给了内核。

execl (path_name, argv[0], argv[1], .....);

其中 path_name 是一个绝对路径, argv[?] 是传给新进程的参数, 很有意思的是 argv[0] 不必是正确的文件名, 实际上可以是任何字符串。(见前面约翰牛的贴子)

在/test 目录下

1.c : --> 生成 b.out

int
main (int argc, char **argv)
{
printf ("%s\n", argv[0]);
exit (0);
}

2.c: --> 生成 a.out
int
main (int argc, char **argv)
{
execl ("/test/b.out", "fake file name", NULL);
exit (0);
}

执行 /test/a.out 得到

"fake file name"

argv[0] 的值是给新进程使用的,内核应该只起到了传递的作用,是否真实,内核并不关心。

 蓝色键盘 回复于:2003-12-30 15:26:50
execl ("/test/b.out", "fake file name", NULL); 

是的,作为命令行参数直接copy了。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有