文章目录
  1. 系统资源限制
  2. 改变工作目录与根目录
  3. 服务器程序后台化

系统资源限制

运行的程序必定会受到系统资源的限制,如物理设备的限制(CPU数量、内存大小等)、系统策略限制(CPU时间)、以及具体实现的限制(文件名的最大长度)。

1
2
3
4
5
6
7
/*
引用方式: #include <sys/resource.h>
返回0: 成功 || 返回-1并设置errno: 失败
*/
int getrlimit(int re, struct rlimit * rlim);

int setrlimit(int re, const struct rlimit * rlim);

其中结构体rlimit的定义如下。

1
2
3
4
struct rlimit{
rlim_t rlim_cur;//rlim_t可以看作int
rlim_t rlim_max;
}

rlim_cur指定资源的软限制,rlim_max指定资源的硬限制。软限制是一个建议性的、最好不要超越的限制,如果超越的话,系统可能向进程发送信号以终止其运行。而硬限制一般是软限制的上限,普通程序可以减小硬限制,只有以root身份运行的程序才能增加硬限制。

re参数指定资源限制类型,比较重要的资源限制类型见下表。

 

改变工作目录与根目录

获取进程当前目录的函数为getcwd。

1
2
3
4
5
6
7
/*
引用方式: #include <unistd.h>
buf: 存储进程当前工作目录的绝对路径名
size: 指定buf地址处内存的大小
返回指向目标存储区的指针: 成功 || 返回NULL并设置errno
*/
char * getcwd(char * buf, size_t size);
  • 若buf=NULL且size=0。则getcwd会在内部使用malloc动态分配内存,并将进程的当前目录存储在其中,然后返回动态分配的内存地址。注意要自己释放这段内存。
  • 若当前工作目录的绝对路径名加一个字符串结束符’\0’的长度大于size,则getcwd返回NULL,并设置errno为ERANGE。

改变进程工作目录的函数为chdir。

1
2
3
4
5
6
/*
引用方式: #include <unistd.h>
path: 指定要切换的目标目录
返回0: 成功 || 返回-1并设置errno: 失败
*/
int chdir(const char * path);

改变进程根目录的函数为chroot。

1
2
3
4
5
6
/*
引用方式: #include <unistd.h>
path: 指定要切换到的目标根目录
返回0: 成功 || 返回-1并设置errno: 失败
*/
int chroot(const char * path);

chroot并不改变进程的当前目录,因此调用chroot后,还是需要使用chdir(“/“)来将工作目录切换到新的根目录。

只有特权进程才能改变根目录。

改变进程根目录之后,可能无法访问类似/dev的文件,但是进程原先打开的文件描述符依然有效。因此可以使用调用chroot函数之前的文件描述符来访问调用chroot函数之后无法访问的文件。

服务器程序后台化

1
2
3
4
5
6
7
/*
引用方式: #include <unistd.h>
nochdir: 指定是否改变工作目录(0代表设置工作目录为根目录)
noclose为0: 标准输入, 标准输出, 标准错误输出都被重定向到/dev/null; 否则仍然使用原来的设备
返回0: 成功 || 返回-1并设置errno: 失败
*/
int daemon(int nochdir, int noclose);