用户信息
#include <sys/types.h>
#include <unistd.h>
uid_t getuid(void);
getuid函数返回程序关联的UID,通常是启动程序的用户的UID
#include <sys/types.h>
#include <pwd.h>
struct passwd * getpwuid(uid_t uid);
struct passwd * getpwnam(const char * name);
getpwuid和getpwnam函数都返回一个指针,该指针指向与某个用户对应的passwd结构。这个用户通过getpwuid的UID参数或通过getpwnam的用户登录名参数来确定。
passwd结构体
struct passwd
{
char * pw_name, 用户登录名
uid_t pw_uid, UID号
gid_t pw_gid, GID号
char * pw_dir, 用户家目录
char * pw_gecos, 用户全名
char * pw_shell, 用户默认shell
}
/* * user.c * * Created on: Jul 22, 2013 * Author: root */ #include <stdio.h> #include <pwd.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char **argv) { uid_t uid; struct passwd * pw; uid = getuid(); pw = getpwuid(uid); printf("1:\n"); printf("name=%s,uid=%d,gid=%d,home=%s,shell=%s\n", pw->pw_name, uid, pw->pw_gid, pw->pw_gecos, pw->pw_shell); pw = getpwnam("yao"); printf("yao:\n"); printf("name=%s,uid=%d,gid=%d,home=%s,shell=%s\n", pw->pw_name, uid, pw->pw_gid, pw->pw_gecos, pw->pw_shell); return 0; }
运行
[root@localhost C_test]# gcc -o user user.c [root@localhost C_test]# ./user 1: name=root,uid=0,gid=0,home=root,shell=/bin/bash yao: name=yao,uid=0,gid=500,home=CentOs,shell=/bin/bash
主机信息
#include <unistd.h>
int gethostname(char * name,size_t namelen);
gethostname函数把机器的网络名写入name字符串。该字符串至少有namelen个字符长。成功返回 0,失败返回-1。
#include <sys/utsname.h>
int uname(struct utsname * name);
通过uname系统调用获得关于主机的更多信息,成功返回一个非负整数。
struct utsname
{
char sysname[], 操作系统名
char nodename[], 主机名
char release[], 系统发行级别
char version[], 系统版本号
char machine[], 硬件类型
}
日志
#include <syslog.h>
void syslog(int priority,const char * message,arguments...)
syslog函数系统的日志设施发送一条日志信息。每条信息都有一个priority参数,该参数是一个严重级别与一个设施值的按位或。严重级别控制日志信息的处理方式,设施值记录日志信息的来源。
设施值默认为LOG_USER
LOG_LOCAL0 LOG_LOCAL1 到LOG_LOCAL7它们的含义由本地管理员指定。
严重级别按优先级递减排列
LOG_EMERG 紧急情况
LOG_ALERT 高优先级故障,例如数据库崩溃
LOG_CRIT 严重错误,例如硬件故障
LOG_ERR 错误
LOG_WARNING 警告
LOG_NOTICE 需要注意的特殊情况
LOG_INFO 一般信息
LOG_DEBUG 调试信息
/* * syslog.c * * Created on: Jul 22, 2013 * Author: root */ #include <syslog.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE * f; f=fopen("a.txt","r"); if(!f) syslog(LOG_ERR|LOG_USER,"error file!"); return 0; }
运行
[root@localhost C_test]# gcc -o syslog syslog.c [root@localhost C_test]# ./syslog
这个程序试图打开一个不存在的文件,在文件打开失败后,调用syslog在系统日志中记录这一事件。
查看/var/log/messages
[root@localhost C_test]# tail -n 10 /var/log/messages Jul 22 21:10:00 localhost named[1955]: error (no valid RRSIG) resolving './NS/IN': 192.58.128.30#53 Jul 22 21:10:00 localhost named[1955]: error (network unreachable) resolving './NS/IN': 2001:500:1::803f:235#53 Jul 22 21:10:00 localhost named[1955]: error (network unreachable) resolving './NS/IN': 2001:503:ba3e::2:30#53 Jul 22 21:10:00 localhost named[1955]: error (network unreachable) resolving './NS/IN': 2001:7fe::53#53 Jul 22 21:10:00 localhost named[1955]: error (network unreachable) resolving './NS/IN': 2001:500:2d::d#53 Jul 22 21:10:00 localhost named[1955]: validating @0xb6147960: . NS: verify failed due to bad signature (keyid=49656): RRSIG validity period has not begun Jul 22 21:10:00 localhost named[1955]: validating @0xb6147960: . NS: no valid signature found Jul 22 21:10:00 localhost named[1955]: error (no valid RRSIG) resolving './NS/IN': 192.33.4.12#53 Jul 22 21:20:40 localhost My_C_test: error file! Jul 22 21:20:47 localhost My_C_test: error file!
改变日志记录行为
void closelog(void);
void openlog(const char * ident,int logopt,int facility);
int setlogmask(int maskpri);
可以通过调用openlog函数来改变日志信息的表示方式。设置一个字符串ident,该字符串会添加在日志信息的前面。facility参数记录一个将被用于后续syslog调用的默认设施值,其默认值是LOG_USER
logopt参数对后续syslog调用的行为进行配置,它是0个或多个参数的按位与
logopt参数 |
说明 |
LOG_PID | 在日志信息中包含进程标识符,这是系统分配给每个进程的一个唯一值 |
LOG_CONS | 如果信息不能被记录到日志文件中,就把它们发送到控制台 |
LOG_ODELAY | 在第一次调用syslog时才打开日志设施 |
LOG_NDELAY |
立即打开日志设施,而不是等到一次记录日志时。 |
openlog函数会分配并打开一个文件描述符,并通过它来写日志,你可以调用closelog函数来关闭它。调用syslog之前无需调用openlog,因为syslog会根据需要自行打开日志设施
可以使用setlogmask函数来设置一个日志掩码,并通过它来控制日志信息的优先级。优先级未在日志掩码中置位的后续syslog调用都被丢弃。所以可以通过这个方法关闭LOG_DEBUG消息而不改变程序主体。
LOG_MASK(priority)为日志信息创建一个掩码,它的作用是创建一个只包含一个优先级的掩码。
LOG_UPTO(priority)创建一个由指定优先级之上的所有优先级(包括该优先级)构成的掩码。
看下日志掩码的作用
/* * logmask.c * * Created on: Jul 22, 2013 * Author: root */ #include <syslog.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { int logmask; openlog("logmask",LOG_PID|LOG_CONS,LOG_USER); syslog(LOG_INFO,"the number of pid=%d",getpid()); syslog(LOG_DEBUG,"debug message"); logmask=setlogmask(LOG_UPTO(LOG_NOTICE)); syslog(LOG_DEBUG,"debug message no"); return 0; }
运行
[root@localhost C_test]# gcc -o logmask logmask.c [root@localhost C_test]# ./logmask
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); 返回进程的PID
pid_t getppid(void); 返回父进程的PID