1. int main(int argc, char *argv[]),参数个数argc包含程序名自身,存放在argv[0]
2.C语言程序中提供命令行开关的标准编程接口:getopt函数
int getopt(int argc, char *const argv[], const char *optstring);
optstring告诉函数一些指定的选项,getopt会将argv中的参数分解成各个选项
GNU C函数库包含getopt的另一个版本,称作getopt_long,它接受以双划线(--)开始的长参数,getopt处理的是-开头的短参数
3.环境变量:用来控制shell脚本和其他程序行为的变量
C语言程序可以通过putenv和getenv函数来访问环境变量。
char *getenv(const char *name)根据环境变量的名字查值
int putenv(const char *sting)将一个格式为“名字=值”的字符串作为参数添加到当前环境中
4.环境仅对程序本身有效。你在程序里做的改变不会反映到外部环境中,这是因为变量的值不会从子进程(你的程序)传播到父进程(shell)
5.可以通过以下方式设置环境变量的值:在默认环境中设置、通过登录shell读取的profile文件来设置、使用shell专用的启动文件(rc)或在shell命令行上对变量进行设定
6.程序可以通过environ变量直接访问这个字符串数组。environ变量的声明如下所示:
extern char **environ;
7.临时文件
很多情况下,程序会利用一些文件形式的临时存储手段。这些临时文件可能保存着一个计算的中间结果,也可能是关键操作前的文件备份。
char *tmpnam(char *s):生成一个唯一的文件名,文件名返回,同时写入s,如果s不为空地址
FILE *tmpfile():创建一个唯一名字的临时文件
8.主机信息
int gethostname(char *name, size_t namelen)
int uname(struct utsname *name)
失败返回-1
9.日志
输入syslogd查看系统是否有这个服务,没有的话
sudo apt-get update
sudo apt-get install syslogd
默认的日志会写到/var/log/message中,debug日志也可能会在/var/log/debug,具体的配置在/etc/syslog.conf
syslog函数向系统的日志设施(facility)发送一条日志信息。每条信息都有一个priority参数,该参数是一个严重级别与一个设施值的按位或。严重级别控制日志信息的处理方式,设施值记录日志信息的来源。
void syslog(int priority, const char *message,arguments..);
严重级别(优先级):由高到底:
LOG_EMERG : 系统无法使用
LOG_ALERT : 必须要立即采取反应行动
LOG_CRIT : 重要状况发生
LOG_ERR : 错误状况发生
LOG_WARNING : 警告状况发生
LOG_NOTICE : 一般状况,但也是重要状况
LOG_INFO : 资讯讯息
LOG_DEBUG : 除错讯息
设施值:
LOG_AUTH : 安全/授权讯息(别用这个,请改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授权讯息
LOG_CRON : 时间守护神专用(cron及at)
LOG_DAEMON : 其它系统守护神
LOG_KERN : 核心讯息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系统
LOG_MAIL : mail次系统
LOG_NEWS : USENET news次系统
LOG_SYSLOG : syslogd内部所产生的讯息
LOG_USER(default) : 一般使用者等级讯息
LOG_UUCP : UUCP次系统
#include <syslog.h>
#include <stdio.h>
int main()
{
FILE *f;
f = fopen("not_here","r");
if(!f)
{
syslog(LOG_WARNING|LOG_USER,"oops - %m\n");
}
return 0;
}
查看/var/log/message
%m转换控制符被替换为一个错误描述,即No such file or directory
void openlog(const char *ident, int logopt, int facility);
通过调用openlog函数来改变日志信息的表示方式。它可以设置一个字符串ident,该字符串会添加在日志信息的前面。通过它来指明是哪个程序创建了这条信息。facility参数记录一个将被用于后续syslog调用的默认设施值,其默认值是LOG_USER。logopt参数对后续syslog调用的行为进行配置,它是0个或多个logopt参数的按位或。
LOG_CONS : 如果送到system logger时发生问题,直接写入系统console。
LOG_NDELAY : 立即开启连接(通常,连接是在第一次写入讯息时才打开的)。
LOG_PERROR : 将讯息也同时送到stderr
LOG_PID : 将PID含入所有讯息中
int setlogmask(int maskpri);
可以使用setlogmask函数来设置一个日志掩码,并通过它来控制日志信息的优先级。优先级未在日志掩码中置位的后续syslog调用都将被丢弃。所以你可以通过这个方法关闭LOG_DEBUG消息而不用改变程序主体。
可以用LOG_MASK(priority)为日志信息创建一个掩码,它的作用是创建一个只包含一个优先级的掩码。还可以用LOG_UPTO(priority)来创建一个由指定优先级之上的所有优先级(包括指定优先级)构成的掩码。
#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int logmask;
openlog("logmask", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO,"informative message, pid = %d", getpid());
syslog(LOG_DEBUG,"debug message, should appear");
logmask = setlogmask(LOG_UPTO(LOG_NOTICE));
syslog(LOG_DEBUG,"debug message, should not appear");
return 0;
}
运行代码后,在/var/log/message中看见了LOG_INFO
在/var/log/debug中看见了LOG_DEBUG
void closelog(void);
关闭log