system函数

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, execwaitpid实现,所以这里有三种返回值:

  1. 如果fork失败或waitpid返回EINTR之外的错误,system返回1,并且errno指明相应的错误。
  2. 如果exec失败,这说明shell不能执行该命令,其返回值如同shell执行了exit(127)一样。
  3. 其它,所有三个函数(fork,exec和waitpid)都成功了,system的返回值是shell的终端状态。(符合waitpid的参数格式)

使用system代替直接使用forkexec的优点是:system处理了所有的错误和信号请求。

Set-User-ID程序

如果在一个设置了SUID的程序里调用system会发生什么?这么做是一个安全漏洞,所以永远不要这么做。

如果设置了SUID的程序拥有超级用户权限的话,那么它的权限会被保留下来,也就是说system执行的命令会以超级用户的身份执行。(当/bin/shbash版本2时,这不会发生,因为在有效用户ID和实际用户ID不同时,bash会重置有效用户ID和实际用户ID)如果程序要这么做的话,请直接使用forkexec,在exec后把权限设置回普通用户。

Comments are closed.