Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1030844
  • 博文数量: 166
  • 博客积分: 10217
  • 博客等级: 上将
  • 技术积分: 2133
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 19:45
文章分类

全部博文(166)

文章存档

2012年(3)

2011年(7)

2010年(18)

2009年(59)

2008年(79)

我的朋友

分类: LINUX

2008-08-13 17:29:36

#include


#include
#include
#include
#include
#include
#include
#define MAX_ARGS 255

static int do_exec (char *cmd)
{
  char *p = cmd;
  char *buf = alloca (strlen (cmd) + 1), *bufp = buf;
  char *argv[MAX_ARGS + 1];
  int nargs = 0;
  int escape = 0, squote = 0, dquote = 0;
  int rc;
  int i;

  if (cmd[0] == 0)
    {
      errno = ENOENT;
      return -1;
    }
 
  while (*p)
    {
      if (escape)
    {
      *bufp++ = *p;
      escape = 0;
    }
      else
    {
      switch (*p)
        {
        case '\\':
          escape = 1;
          break;
        case '"':
          if (squote)
        *bufp++ = *p;
          else
        dquote = !dquote;
          break;
        case '\'':
          if (dquote)
        *bufp++ = *p;
          else
        squote = !squote;
          break;
        case ' ':
          if (!squote && !dquote)
        {
          *bufp = 0;
          if (nargs < MAX_ARGS)
            argv[nargs++] = strdup (buf);
          bufp = buf;
          break;
        }
        default:
          *bufp++ = *p;
          break;
        }
    }
      p++;
    }
 
  if (bufp != buf)
    {
      *bufp = 0;
      if (nargs < MAX_ARGS)
    argv[nargs++] = strdup (buf);
    }

  argv[nargs] = NULL;
  rc = execvp (argv[0], argv);

  for (i = 0; i < nargs; i++)
    free (argv[i]);

  return rc;
}

一应用
int main()
{
    int bufsize = 16 * 1024 * 1024;
    struct sockaddr_nl anl;
    int res, i, sk;

     pid_t pid;
     pid = fork();
        switch (pid) {
            case 0:
                           {
         printf("fork suceess.........\n");
            do_exec("mount /dev/sda1 /mnt");
   
                break;
                          }
            case -1:
                err("fork fail\n");
                break;
            default:
                break;
              }
      

return 0;

}


另一类似的应用
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) 0}; //以NULL结尾
execv(“/bin/ls”,argv);


范例
/* 执行/bin/ls -al /etc/passwd */
#include
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
execv(“/bin/ls”,argv);
}
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd




阅读(1000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~