您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Linux程序设计复习总结(三)Linux环境

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


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进