Linux程序设计笔记(第4章 Linux环境)

*   程序参数

<span style="font-family:KaiTi_GB2312;font-size:14px;">int main(int argc, char *argv[]);
argc代表程序参数个数;argv代表程序参数自身的值</span>

    操作系统启动一个新程序时,参数argc和argv都被另一个程序shell设置并传递给main。shell接受用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组。参数个数argc包含程序名本身,argv数组也包含程序名并将它作为第一个元素argv[0]。如果某个参数内容有空格,可用''或""引号包含该参数。例如:

<span style="font-family:KaiTi_GB2312;font-size:14px;">$ myprog left right 'and center'
argc:4
argv:{""myprog", "left", "right", "and center"}</span>

    注意:Linux的shell一般会在设置argc和argv之前对文件名参数进行通配符扩展。

文件名

文件名,如data.txt是命令中最常用的参数。只是用户有时候只知道文件名的一部分,或者想同时对具有相同扩展名或以相同符号开始的多个文件进行操作。这时可以利用通配符来进行扩展。

通配符

说明

*

匹配任何字符和任何数目的字符组合

匹配任何单个字符

[]

匹配任何包含在括号内的单字符

    例如:下例中的参数 *.so,shell在设置argc和argv前,将*.so中的通配符*扩展为libbill.so与libfoo.so,即把扩展名为.so的文件名全部显示出来。

<span style="font-family:KaiTi_GB2312;font-size:14px;">$ ls *so
libbill.so  libfoo.so
$ ./myprog 007 'hi sir' *.so
./myprog 007 hi sir libbill.so libfoo.so 
$ 
</span>

<span style="font-family:KaiTi_GB2312;font-size:14px;">$ man getopt_long
GETOPT(3)                  Linux Programmer’s Manual                 GETOPT(3)

NAME
       getopt - Parse command-line options

SYNOPSIS
       #include <unistd.h>

       int getopt(int argc, char * const argv[],
                  const char *optstring);

       extern char *optarg;
       extern int optind, opterr, optopt;

       #define _GNU_SOURCE
       #include <getopt.h>

       int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

       int getopt_long_only(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);
</span>


1> getopt

功能:  

   Linux提供了getopt函数,它支持需要关联值和不需要关联值的选项。

参数:

   getopt函数将传递给程序的main函数的argc和argv作为参数,同时接受一个选项指定符字符串optstring。

   其中,optstring只是一个字符列表,每个字符列表代表一个单字符选项。如果一个字符后面紧跟一个冒号(:),则表明该选项有一个关联值作为下一个参数。

   例如:

<span style="font-family:KaiTi_GB2312;font-size:14px;">getopt(argc, argv, "if:lr");
有-i、-f、-l、-r选项,其中-f选项后要紧跟一个文件名参数。</span>

返回:

   返回argv数组中的下一个选项字符(如果有的话)。循环调用getopt就可以依次得到每个选项。

2> getopt_long

功能:

    包含了getopt的功能,并接受以双划线(--)开始的长参数。

参数:

    相比getopt多了两个参数:const struct option *longopts, int *longindex

<span style="font-family:KaiTi_GB2312;font-size:14px;">struct option
{
    const char *name; /*长选项的名字*/
    int has_arg;      /*该选项是否带参数。0表示不带参数,1表示必须有一个参数,2表示有一个可选参数*/
    int *flag;        /*设置为NULL表示当找到该选项时,getopt_long返回在成员val里给出的值;否则,返回0,并将val的值                         写入指向的变量*/
    int val;          /*getopt_long为该选项返回的值*/
};</span>

    longopts是一个option结构数组,它描述了每个长选项并告诉getopt_long如何处理它们。

    longindex可以作为optind的长选项版本使用。对于每个识别的长选项,它在长选项数组中的索引就写入该变量。

返回:

  • 程序使用短选项,则返回段选项字符。当需要参数时,则在返回之前将参数存入到optarg中。
  • 程序使用长选项,则返回值根据flag和val确定。当flag为NULL,则返回val值。当val值等于短选项值,则可以使用短选项解析函数解析长选项;当flag不为NULL,则将val值存入flag所指向的存储空间,getopt_long返回0。
  • 所有选项解析结束时返回-1
  • 存在不能识别的选项或者带参数选项的参数不存在时返回'?'

3> getopt_long_only

功能:

    getopt_long_only会将--name和-name两种选项都当做长参数来匹配。只有在-name不能在longopts中匹配时才将其拆解成-n、-a、-m、-e这样的参数到optstring中进行匹配。

参数与返回值与getopt_long_only一样。


*   时间和日期

    所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1日午夜(0点)。这是“UNIX纪元的起点”,Linux系统中所有的时间都以从那时起经过的秒数来衡量。

1> time()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
time_t time(time_t *tloc);
功能:获取底层的时间值
参数:tloc不为NULL,则把返回值写入tloc
返回值:从纪元开始至今的秒数</span>

2> difftime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
double difftime(time_t time1, time_t time2);
功能:计算两个时间之间的差
返回值:time1-time2的值</span>
3> gmtime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
struct tm *gmtime(const time_t timeval);
功能:把底层时间值分解为tm结构</span>

tm成员

说明

int tm_sec

秒,[0-59]

int tm_min

分,[0-59]

int tm_hour

时,[0-23]

int tm_mday

月份中的日期,[1-31]

int tm_mon

月份,[0-11]

int tm_year

1900年开始计算的年份

int tm_wday

星期几,[0-6]

int tm_yday

年份中的日期,[0-365]

int tm_isdst

是否夏令时

4> localtime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
struct tm *localtime(const time_t *timeval);
返回值除了已根据当地时区是否采用夏令时做了调整,其他与gmtime一样</span>

5> mktime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
time_t mktime(struct tm *timeptr);
把已分解出来的tm结构再转换为原始的time_t值
</span>

6> asctime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
char *asctime(const struct tm *timeptr);
返回一个与date命令一样的输出的字符串,它表示由tm结构所给出的时间和日期。
</span>

7> ctime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
char *ctime(const time_t *timeval);
等效于:
asctime(localtime(timeval));
</span>

8> strftime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr); /*类似针对时间和日期的sprintf*/
功能:格式化tm结构所表示的时间和日期,并将结果放在字符串s中。字符串被指定(至少)maxsize个字符长。fotmat字符串用于控制写入字符长s的内容。
</span>

9> strptime()

<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <time.h>
char *strptime(const char *buf, const cha *format, struct tm *timeptr);/*类似针对时间和日期的sscanf*/
功能:根据format字符串来填充tm结构的成员。
返回:返回一个指针,指向转换过程处理的最后一个字符后面的那个字符。
</span>


*  日志

   系统程序经常需要向控制台或日志文件写信息。这些信息可能指示错误、警告或是与系统状态有关的一般信息。

   对一个典型的Linux安装来说:

   文件/var/log/messages包含所有系统信息。

   文件/var/log/mail包含来自邮件系统的其他日志信息。

   文件/var/log/debug可能包含调试信息。

<span style="font-family:KaiTi_GB2312;font-size:14px;">include <syslog.h>
void syslog(int priority, const char *message, arguments...);
向系统的日志设施发送一条日志信息。</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">#include <syslog.h>
void openlog(const char *ident, int logopt, int facility);
void closelog(void);
int setlogmask(int maskpri);
openlog会分配并打开一个文件描述符,并通过它来写日志。</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">closelog可用来关闭它。</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">setlogmask用来设置一个日志掩码,并通过它来控制日志信息的优先级。优先级未在日志掩码中置位的后续syslog调用都将被丢弃</span>











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值