system函数
system函数用于执行一个命令字符串,例如获得时间和日期:
system(“date > file”);
虽然ISO C定义了system函数,但是它的操作非常依赖系统。POSIX.1包含了system接口,在POSIX环境中扩展了它在ISO C中定义的行为。
#include <stdlib.h>
int system(const char *cmdstring);
|
Returns: (see below) |
如果cmdstring是null指针,仅当指令处理器可用时,system返回非零。这个功能用于测试system函数是否支持当前操作系统。在UNIX系统下,system一直可用。
因为system函数由fork, exec和waitpid实现,所以这里有三种返回值:
- 如果fork失败或waitpid返回EINTR之外的错误,system返回1,并且errno指明相应的错误。
- 如果exec失败,这说明shell不能执行该命令,其返回值如同shell执行了exit(127)一样。
- 其它,所有三个函数(fork,exec和waitpid)都成功了,system的返回值是shell的终端状态。(符合waitpid的参数格式)
使用system代替直接使用fork和exec的优点是:system处理了所有的错误和信号请求。
Set-User-ID程序
如果在一个设置了SUID的程序里调用system会发生什么?这么做是一个安全漏洞,所以永远不要这么做。
如果设置了SUID的程序拥有超级用户权限的话,那么它的权限会被保留下来,也就是说system执行的命令会以超级用户的身份执行。(当/bin/sh是bash版本2时,这不会发生,因为在有效用户ID和实际用户ID不同时,bash会重置有效用户ID和实际用户ID)如果程序要这么做的话,请直接使用fork和exec,在exec后把权限设置回普通用户。