日志
#include <syslog.h>
void syslog(int priority , const char* message ,...);
void openlog(const char * ident , int logopt ,int facility);
int setlogmask(int maskpri);
void closelog();
用户信息
uid euid gid guid
#include < sys / types.h >
#include < unistd.h >
uid_t getuid();
uid_t geteuid();
gid_t getgid();
gid_t getegid();
int setuid(uid_t uid);
int seteuid(uid_t uid);
int setgid(gid_t gid);
int setegid(gid_t gid);
切换用户
注意从root切换
进程之间的关系
pid pgid
#include <unistd.h>
pgid_t getpid(pid_t pid);
int setpgid(pid_t pid , pgid_t pgid);
pid = pgid pid 为群主
pid = 0 , 设置当前的进程PGID 为pgid
pgid =0,使用pid作为目标PGID
会话
一些有关联的进程会形成一个会话
#include < unistd.h>
pid_t setsid(void);
不能由当前租的首领创建,由其他成员创建,并把这个成员的pid作为进程组的PGID;
系统资源限制
#include <sys /resource.h>
int getrlimit (int resource ,struct rlimit *rlim );
int setrlimit (int resource ,struct rlimit *rlim );
struct rlimit
{
rlim_t rlim_cur ;
rlim_t rlim_max;
};
resourece 的取值是
RLIMIT_AS
RLIMIT_CORE
RLIMIT_CPU
RLIMIT_DATA
RLIMIT_FSIZE
RLIMIT_NOFILE
RLIMIT_NPROC
RLIMIT_SIGPENDING
RLIMIT_STACK
改变工作目录和根目录
#include <unistd.h>
char* getcwd(char* buf ,size_t size);
int chdir(const char* path);
int chroot(const char * path);
解决web服务器中的根目录,例如web中/var/www
服务器后台化
bool daemonize()
{
pid_t pid = fork();
if(pid < 0){
return false
}else if(pid > 0){
exit(0);
}
umask( 0 );
pid_t sid = setsid();
if(sid < 0){
return false;
}
if(chdir("/) < 0){
return false;
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
open("/dev/null",O_RDONLY);
open("/dev/null",O_RDWR);
open("dev/null",O_RDWR);
return true;
}
使用linux的库函数完成同样的效果为:
int daemon(int nochdir , int noclose);