|
发表于 2005-6-1 12:01:19
|
显示全部楼层
ok_snail, 既然你都知道是“有个system()调用”了,那就去看看 system() 函数的说明啊。
[code:1]$man 3 system
SYSTEM(3) Linux Programmer's Manual SYSTEM(3)
NAME
system - execute a shell command
SYNOPSIS
#include <stdlib.h>
int system(const char *command);
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c
command, and returns after the command has been completed. During exe-
cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
will be ignored.
RETURN VALUE
The value returned is -1 on error (e.g. fork failed), and the return
status of the command otherwise. This latter return status is in the
format specified in wait(2). Thus, the exit code of the command will
be WEXITSTATUS(status). In case /bin/sh could not be executed, the
exit status will be that of a command that does exit(127).
If the value of command is NULL, system() returns nonzero if the shell
is available, and zero if not.
system() does not affect the wait status of any other children.
CONFORMING TO
ANSI C, POSIX.2, BSD 4.3
NOTES
If the _XOPEN_SOURCE feature test macro is defined, then the macros
described in wait(2) (WEXITSTATUS(), etc.) are made available when
including <stdlib.h>.
As mentioned, system() ignores SIGINT and SIGQUIT. This may make pro-
grams that call it from a loop uninterruptable, unless they take care
themselves to check the exit status of the child. E.g.
while(something) {
int ret = system("foo");
if (WIFSIGNALED(ret) &&
(WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
break;
}
Do not use system() from a program with set-UID or set-GID privileges,
because strange values for some environment variables might be used to
subvert system integrity. Use the exec(3) family of functions instead,
but not execlp(3) or execvp(3). system() will not, in fact, work prop-
erly from programs with set-UID or set-GID privileges on systems on
which /bin/sh is bash version 2, since bash 2 drops privileges on
startup. (Debian uses a modified bash which does not do this when
invoked as sh.)
In versions of glibc before 2.1.3, the check for the availability of
/bin/sh was not actually performed if command was NULL; instead it was
always assumed to be available, and system() always returned 1 in this
case. Since glibc 2.1.3, this check is performed because, even though
POSIX.1-2001 requires a conforming implementation to provide a shell,
that shell may not be available or executable if the calling program
has previously called chroot(2) (which is not specified by
POSIX.1-2001).
It is possible for the shell command to return 127, so that code is not
a sure indication that the execve() call failed.
SEE ALSO
sh(1), signal(2), wait(2), exec(3)
2004-12-20 SYSTEM(3)
[/code:1] |
|