#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 |