用户信息 主机信息 日志行为

用户信息

#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





 





你可能感兴趣的:(log,user,host)