免费注册 查看新帖 |

Chinaunix

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

急!请问能这样用switch吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-06 12:24 |只看该作者 |倒序浏览
在linux下写一个限制命令的shell,限定用户只能使用switch中列出的命令:
cmd = argv[0];
switch (cmd){
       case 'route':
       case 'ls':
       case 'ifconfig':
              execvp(argv[0], argv);
              break;
}

gcc编译后:
warning:assignment makes integer from pointer without a cast
warning:character constant too long for its type
warning:case label value exceeds maximum value for type
warning:character constant too long for its type

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-02-06 12:26 |只看该作者
不行。
switch后必须是整形类型。

论坛徽章:
0
3 [报告]
发表于 2007-02-06 12:29 |只看该作者
--

       case 'route':
       case 'ls':
       case 'ifconfig':

单引改双引

同时,应用 str*cmp 进行比较。你这里至多只比较地址。

--

[ 本帖最后由 Iamlangue 于 2007-2-6 12:30 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-02-06 12:29 |只看该作者
那我只能用if来限定吗?有没有什么好办法?我要用的命令有20多条,用if判断太繁了。

论坛徽章:
0
5 [报告]
发表于 2007-02-06 12:31 |只看该作者
看我3楼的补充

论坛徽章:
0
6 [报告]
发表于 2007-02-06 12:33 |只看该作者
命令如果多,不妨放到数组里,循环一下

论坛徽章:
0
7 [报告]
发表于 2007-02-06 12:34 |只看该作者
原帖由 Iamlangue 于 2007-2-6 12:29 发表
--

       case 'route':
       case 'ls':
       case 'ifconfig':

单引改双引

同时,应用 str*cmp 进行比较。你这里至多只比较地址。

--



非常感谢大家指点!

改双引后报:case label does not reduce to an integer constant

"同时,应用 str*cmp 进行比较。你这里至多只比较地址。"---------我c不熟,能再详细一点吗?

论坛徽章:
0
8 [报告]
发表于 2007-02-06 12:43 |只看该作者
--

我给个方法,基于 6 楼的思想:

char *cmds[]={"ls", "route", "ifconfig", 0}; /* 完全可以假定  字符串的首字节地址不为 0 */
int i=0;

while (cmds[i]) {
    if (!strcmp(cmds[i], argv[0]))
        execvp(argv[0], argv);
    i+=1;
}

另外我认为你写的程序有问题。既然本进程被调用的时候得到了这个 argv[0],你再次调用它,不成了死循环么

--

论坛徽章:
0
9 [报告]
发表于 2007-02-06 12:46 |只看该作者
我的程序:
int execute(char *argv[])

{
        int        pid ;
        int        child_info = -1;
                char         cmd;

        if ( argv[0] == NULL )                /* nothing succeeds        */
                return 0;

        if ( (pid = fork())  == -1 )
                perror("fork");
        else if ( pid == 0 ){
                signal(SIGINT, SIG_DFL);
                signal(SIGQUIT, SIG_DFL);
                                cmd = argv[0];  
                switch (cmd){
                case "route":
                case "ifconfig":
                        execvp(argv[0], argv);
                        break;
                }
                perror("cannot execute command");
                exit(1);
        }
        else {
                if ( wait(&child_info) == -1 )
                        perror("wait");
        }
        return child_info;
}

---------------------------------------------------------------------------------------------------


谢谢Iamlangue指点,我再试试你说的方法,不过我没看出来哪里会出现死循环。

论坛徽章:
0
10 [报告]
发表于 2007-02-06 12:48 |只看该作者
如果 argv[] 是从 main() 那里得到的,就会发生死循环
如果是自己构建的,就不会在这里发生死循环
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP