#include <syslog.h> void syslog ( int priority, const char* message, ... ); // 可变参数
#include <syslog.h> #define LOG_EMERG 0 /* 系统不可用 */ #define LOG_ALERT 1 /* 报警,须要当即采起动做 */ #define LOG_CRIT 2 /* 很是严重的状况 */ #define LOG_ERR 3 /* 错误 */ #define LOG_WARNING 4 /* 警告 */ #define LOG_NOTICE 5 /* 通知 */ #define LOG_INFO 7 /* 信息 */ #define LOG_DEBUG 8 /* 调试 */
#include <syslog.h> void openlog ( const char* ident, int logopt, int facility );
#define LOG_PID 0x01 /* 在日志消息中包含程序PID */ #define LOG_CONS 0x02 /* 若是消息不能记录到日志文件,则打印至终端 */ #define LOG_ODELAY 0x04 /* 延迟打开日志功能直到第一次调用syslog */ #define LOG_NDELAY 0x08 /* 不延迟打开日志功能 */
#include <syslog.h> int setlogmask( int maskpri );
setlogmask(LOG_ERR); //仅仅记录ERR级别的日志消息 setlogmask(LOG_UPTO(LOG_ERR)); //记录ERR以及以前的全部日志的消息[0,3]
#include <syslog.h> void closelog();
#include <sys/types.h> #include <unistd.h> uid_t getuid(); //获取实际用户ID uid_t geteuid(); //获取有效用户ID gid_t getgid(); // 获取实际组ID gid_t getegid(); // 获取有效组ID int setuid( uid_t uid ); //设置实际用户ID int seteuid( uid_t uid ); //设置有效用户ID int setgid( gid_t gid ); // 设置实际组ID int setegid( gid_t gid ); // 设置有效组ID
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { uid_t uid = getuid(); uid_t euid = geteuid(); printf("userid is %d,effective userid is %d\n",uid,euid); return 0; }
@ubuntu:~$ sudo chown root:root test_uid // 修改目标文件的全部者为root @ubuntu:~$ sudo chmod +s test_uid // 设置目标文件的set-user-id 标志 注意这段很重要 @ubuntu:~$ ./test_uid // 运行程序 userid is 1000,effective userid is 0从测试程序的输出来看,进程的UID是启动程序的用户的ID,而EUID则是root帐户(文件的全部者) 的ID。
#include <unistd.h> pid_t getpgid( pid_t pid );
#include <unistd.h> int setpgid( pid_t pid, pid_t pgid );
#include <unistd.h> pid_t setsid( void );
#include <unistd.h> pid_t getsid ( pid_t pid );
#include <sys/resource.h> int getrlimit( int resource, struct rlimit *rlim ); int setrlimit( int resource, const struct rlimit *rlim ); rlimit结构体的定义以下: struct rlimit { rlim_t rlim_cur; //软限制 rlim_t rlim_max; //硬限制 };
#include <unistd.h> char* getcwd( char* buf, size_t size ); int chdir( const char* path );
#include <unistd.h> int chroot( const char* path );
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> 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; printf("2. pid: %ld, parent id: %ld\n", (long)getpid(), (long)getppid()); //关闭标准输入,标准输出,标准错误输出 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); //重定向标准输入,标准输出,标准错误输出到/dev/null open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); return true; } int main(int argc, char **argv) { printf("1. pid: %ld, parent id: %ld\n", (long)getpid(), (long)getppid());; daemonize(); return 0; }
#include <unistd.h> int daemon(int nochdir, int noclose);nochdir参数用于指定是否改变工做目录,若是是0,则工做目录将设置为”/“, 不然继续使用当前工做目录。
noclose参数为0时,标准输入,标准输出,标准错误输出都被重定向到/dev/null,不然依然使用原来的设备。linux
调用成功时返回0,失败时返回-1,并设置errno。shell