Chinaunix

标题: 急!请问能这样用switch吗? [打印本页]

作者: ncxsx    时间: 2007-02-06 12:24
标题: 急!请问能这样用switch吗?
在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
作者: lenovo    时间: 2007-02-06 12:26
不行。
switch后必须是整形类型。
作者: Iamlangue    时间: 2007-02-06 12:29
--

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

单引改双引

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

--

[ 本帖最后由 Iamlangue 于 2007-2-6 12:30 编辑 ]
作者: ncxsx    时间: 2007-02-06 12:29
那我只能用if来限定吗?有没有什么好办法?我要用的命令有20多条,用if判断太繁了。
作者: Iamlangue    时间: 2007-02-06 12:31
看我3楼的补充
作者: Iamlangue    时间: 2007-02-06 12:33
命令如果多,不妨放到数组里,循环一下
作者: ncxsx    时间: 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不熟,能再详细一点吗?
作者: Iamlangue    时间: 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],你再次调用它,不成了死循环么

--
作者: ncxsx    时间: 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指点,我再试试你说的方法,不过我没看出来哪里会出现死循环。
作者: Iamlangue    时间: 2007-02-06 12:48
如果 argv[] 是从 main() 那里得到的,就会发生死循环
如果是自己构建的,就不会在这里发生死循环
作者: ncxsx    时间: 2007-02-06 12:55
int main()
{
        char        *cmdline, *prompt, **arglist;
        int        result;
        void        setup();

        prompt = DFL_PROMPT ;
        setup();

        while ( (cmdline = next_cmd(prompt, stdin)) != NULL ){
                if ( (arglist = splitline(cmdline)) != NULL  ){
                        result = execute(arglist);
                        freelist(arglist);
                }
                free(cmdline);
        }
        return 0;
}

void setup()
{
        signal(SIGINT,  SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
}

void fatal(char *s1, char *s2, int n)
{
        fprintf(stderr,"Error: %s,%s\n", s1, s2);
        exit(n);
}
------------------------------------------------------------------------
作者: ncxsx    时间: 2007-02-06 12:56
好的,谢谢!我再调调。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2