免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5911 | 回复: 11
打印 上一主题 下一主题

[C] 关于execl函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-25 15:07 |只看该作者 |倒序浏览
5可用积分
下面是一个关于解释器的问题:
/* Program source : showargs.c *
            * Program name  : showargs  */
            
            #include <unistd.h>
            
            int
            main(int argc, char *argv[])
            {
            int i;
            for(i = 0; i < argc; i++)
            {
            printf("arg[%d]: %s\n", i, argv);
            }
            return 0;
            }
编译:gcc -o showargs showargs.c


我们在同一个目录下再写一个脚本:
代码:
#!/home/kiron/showargs addargs
这个脚本我们命名为testexec


/* Program source : mytest.c *
            * Program name  : mytest  */
            #include <stdio.h>
            
            int
            main(void)
            {
            execl("/home/kiron/testexec", "testexec", "arg1", "arg2", (char *) 0);
            return 0;
            }
编译:gcc -o mytest mytest.c
执行:

代码:
            $ ./mytest
            arg[0]: /home/kiron/showargs
            arg[1]: addargs
            arg[2]: /home/kiron/testexec
            arg[3]: arg1
            arg[4]: arg2

问题来了,execl("/home/kiron/testexec", "testexec", "arg1", "arg2", (char *) 0)这里面的"testexec“这个参数没有输出啊,跑哪去了?
我试过把这句话改成execl("/home/kiron/showargs", "mygod", "arg1", "arg2", (char *) 0)然后运行mytest,输出为mygod  arg1  arg2,
这说明mygod这个参数还是有传给被execl调用的进程啊,那上面那个怎么没有输出testexec呢?
谢谢!

最佳答案

查看完整内容

我说一个稍微离题,但相关的有趣问题。#! 来引用一个解析器,这个解析器通常要把 # 作为行注释符,这样解析器才能忽略这一行。如果解析器不把 #!,则不能这样写。有时候能绕过去,比如 scheme:#! comment !# ,但后面那个 !# 要另起一行,否则会被当成参数传给 guile .

论坛徽章:
0
2 [报告]
发表于 2008-07-25 15:07 |只看该作者
我说一个稍微离题,但相关的有趣问题。

#! 来引用一个解析器,这个解析器通常要把  # 作为行注释符,这样解析器才能忽略这一行。

如果解析器不把 #!,则不能这样写。

有时候能绕过去,比如 scheme:


  1. #!/usr/bin/guile
  2. !#

  3. (display "hello world\n")
复制代码


#! comment !# ,但后面那个 !# 要另起一行,否则会被当成参数传给 guile .

论坛徽章:
0
3 [报告]
发表于 2008-07-25 15:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2008-07-26 21:43 |只看该作者
回复错了,改正

论坛徽章:
0
5 [报告]
发表于 2008-07-26 22:03 |只看该作者
我试过把这句话改成execl("/home/kiron/showargs", "mygod", "arg1", "arg2", (char *) 0)然后运行mytest,输出为mygod  arg1  arg2,

你确定?我试过不输出mygod

论坛徽章:
0
6 [报告]
发表于 2008-07-27 09:21 |只看该作者
原帖由 huangbt_unix 于 2008-7-25 15:07 发表
下面是一个关于解释器的问题:
/* Program source : showargs.c *
            * Program name  : showargs  */
            
            #include  
            
            int
            ma ...


mytest --> testexec ,set arg[0]="testexec",参数为 "arg1", "arg2".  // 这里 arg[0] 是被执行程序的名字。

但 testexec 是个脚本,需要解析器。你指定解析器为 .../showargs, 所以 .../showargs 被加载:

.../showargs, 带上指定参数 addargs, 带上被解析文件 .../testexec, 带上原来的参数 "arg1", "arg2" //被执行程序的名字,arg[0] 是 .../showargs. 即

.../showargs addargs .../testexec arg1 arg2  //arg[0] 设置为 .../showwargs

在一开始,.../testexec 是被执行的,后来是被解析的。如果你认为应该保留原来的 testexec, 或 mygod,那你觉得放在什么位置合适呢?这个东西现在不需要了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2008-07-27 09:29 |只看该作者
printf("arg[%d]: %s\n", i, argv);
这一句代码正确吗

论坛徽章:
0
8 [报告]
发表于 2008-07-27 09:30 |只看该作者
>printf("arg[%d]: %s\n", i, argv);>这一句代码正确吗 error!argv[i]不过貌似是Discuz!代码模式的原因把它给弄没了

[[i] 本帖最后由 zszjxh 于 2008-7-27 09:37 编辑 [/i]]

论坛徽章:
0
9 [报告]
发表于 2008-07-28 08:31 |只看该作者
不好意思, printf("arg[%d]: %s\n", i, argv); 这句话写错了,应该是 printf("arg[%d]: %s\n", i, argv);但我程序是没错的。

论坛徽章:
0
10 [报告]
发表于 2008-07-28 08:40 |只看该作者
非常感谢大家的回答,
TO四楼:我确定会输出mygod,我有实验过的啊
TO五楼:非常感谢你的回答,现在有想通一点点了,那你的意思就是:testexec或mygod就是是有传给testexec的,只是解释器把它丢掉了,我可以这样理解吗?非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP