程序引数
当操作系统启动一个新的程序时,参数argc和argv[]都会传递给程序。这些参数通常都是由另一个程序提供,大多数情况下都是有shell请求系统开始新的程序,shell获取命名行,然后分割成独立的词组保存在argv数组中。argc是记录参数个数的,包括程序名。程序名保存在argv[0]中。
环境变量
Unix定义了很多标准的环境变量,包括终端类型、默认编辑器,时区......在C程序中可以使用getenv和setenv两个方法来使用环境变量。
#include <stdlib.h>
char *getenv(const char *name); //返回获取name的环境变量值指针
int putenv(const char *string); //将“name=value”格式的值存储到环境变量中。
时间和日期
Times通过使用一个结构体 time_t 来进行控制,这是一个长整形,定义在time.h头文件中。
#include <time.h>
time_t time(time_t *tloc); //返回从epoth到现在的秒数,
double difftime(time_t time1, time_t time2); // 查看时间差,time1 - time2
#include <time.h>
struct tm *gmtime(const time_t timeval); //gmtime将低级别的时间值分解到一个结构体tm中,tm至少包含
int tm_sec Seconds, 0-61
int tm_min Minutes, 0-59
int tm_hour Hours, 0-23
int tm_mday Day in the month, 1-31
int tm_mon Month in the year, 0-11 (January = 0)
int tm_year Years since 1900
int tm_wday Day in the week, 0-6 (Sunday = 0)
int tm_yday Day in the year, 0-365
int tm_isdst Daylight savings in effect
struct tm *localtime(const time_t *timeval); //返回一个调整到本地时区的的tm结构体。
time_t mktime(struct tm *timeptr); //将tm类型的值转换到time_t类型。错误,返回-1.
char *asctime(const struct tm *timeptr); //将tm类型的tmeptr转化给一个包含日期和时间的字符串返回
char *ctime(const time_t *timeval); //相当于asctime(localtime(timeval)),就是获取本地时间并转化给一个包含日期和时间的字符串返回。
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr); //将timeptr安format的格式转化为最长为maxsize的字符串s。strftime(buf, 256, “%A %d %B, %I:%S %p”, tm_ptr);
char *strptime(const char *buf, const char *format, struct tm *timeptr); //将格式化后字符串buf,按照format的格式填充到timeptr中,返回值指向最后一个转化后的字符。如buf= "Thu 26 July 2007, 17:53 will do fine"; result = strptime(buf,”%a %d %b %Y, %R”, tm_ptr);
临时文件
#include <stdio.h>
char *tmpnam(char *s); //返回产生一个唯一的文件名的字符串,如果s不为空,放入字符串中。
FILE *tmpfile(void); //这个方法返回一个指向唯一文件名的临时文件流指针。
用户信息
#include <sys/types.h>
#include <unistd.h>
uid_t getuid(void); //返回程序相关的uid
char *getlogin(void); //返回当前用户的登入名
#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid); //根据uid获取对应的passwd数据结构体
struct passwd *getpwnam(const char *name); //根据用户获取对应的passwd数据结构体
passwd结构体定义在pwd.h中。有如下的成员 : char *pw_name The user’s login name
uid_t pw_uid The UID number
gid_t pw_gid The GID number
char *pw_dir The user’s home directory
char *pw_gecos The user’s full name
char *pw_shell The user’s default shell
主机信息
#include <unistd.h>
int gethostname(char *name, size_t namelen); //将主机的网络名存入字符串name中,字符串的长度假设为namelen.
#include <sys/utsname.h>
int uname(struct utsname *name); //将host的信息放入到utsname数据结构的指针中。
utsname包含的成员 char sysname[] The operating system name
char nodename[] The host name
char release[] The release level of the system
char version[] The version number of the system
char machine[] The hardware type
Logging
通常log信息都是记录在系统中的,并且他们都是可变的,他们可能是/usr/adm或者/var/log。在典型的linux安装中,文件/var/log/messages包含着所有系统信息,/var/log/mail包含着关于邮件系统的log信息,/var/log/debug可能包含debug信息。根据你的系统版本,你可以检查你的系统配置文件/etc/syslog.conf或者/etc/syslog-ng/syslog-ng.conf。
即使系统信息的格式和存储都会改变,但是产生信息的方法是标准的,Linux为所有的程序提供一个接口产生log信息,通过使用syslog方法:
#include <syslog.h>
void syslog(int priority, const char *message, arguments...);
这个syslog方法发动一个log信息给logging设备,每一条信息都有一个priority参数,它是一个严重级别和一个设备值或运算得来的。设备值(from syslog.h)包括LOG_USER用于指明这条信息来自用户应用程序,还有 LOG_LOCAL0, LOG_LOCAL1, up to LOG_LOCAL7,都是有本地管理员赋值。
这些严重级别按照权限递减,如下:
LOG_EMERG An emergency situation
LOG_ALERT High-priority problem, such as database corruption
LOG_CRIT Critical error, such as hardware failure
LOG_ERR Errors
LOG_WARNING Warning
LOG_NOTICE Special conditions requiring attention
LOG_INFO Informational messages
LOG_DEBUG Debug messages
LOG_EMERG信息可能会广播给所有用户,LOG_ALERT信息可能会邮寄给管理员,LOG_DEBUG 可能会被忽略,其他的会被写入文件。当你想要创建一个log信息时,你可以写一个程序通过调用lsyslog函数使用logging设备来创建。由systlog创建的log信息包括信息头和信息体,信息头由设备标识器和日期时间创建,信息体则来自传递给syslog的message的参数,有点类似printf的格式化字符串。传递给syslog的参数可以根据printf类型转换。另外,“%m”可以用于添加根据当前errno的值的错误信息,这对于输出错误信息非常有用。
在syslog.h中用于改变logging设备行为的其他方法:
#include <syslog.h>
void closelog(void);
void openlog(const char *ident, int logopt, int facility);
int setlogmask(int maskpri);