todo

exit函数 2 进程终止

32位整型与上8个1,exit返回的值只有256种,-128到+127

atexit():钩子函数

没有完全释放就结束了,一个一个挂在钩子上

像c++中的析构函数

3 命令行分析实例

常用函数 getopt() getopt_long()【长格式】;shell命令行分析

选项加非选项

ls -l -i -n -a /etc/ /tmp

不仅看当前目录下的文件,也看etc和tmp下的文件。顺序可打乱。命令项也可以连用

ls /etc/ /tmp -lai

cp mydays.c mydate.c

./maydate -y/m/d

--表示选项参数结束 ,后面是非选项传参touch -- -a

perror 全局变量。getopt 关联多个全局变量.

 
#define FMSTRSIZE 1024
 
int c; //返回值
 
char fmtstr[FMTSTRSIZE];
 
  
 
fmtstr[0]='\0';
 
  
  
  
 
while(1)
 
{
 
c=getopt(argc,argv,"HMSymd");//最后一个参数 optstring
 
if(c<0)
 
break;
 
switch(c)
 
{
 
case 'H':
 
break;
 
case 'M':
 
strncat(fmtstr,"%M ",FMTSTRSIZE);
 
break;
 
case 'S':
 
strncat(fmtstr,"%S ",FMTSTRSIZE);
 
break;
 
case 'y':
 
break;
 
case 'm':
 
break;
 
case 'd':
 
break;
 
default:
 
break;
 
}
 
}
 
strftime(timestr,TIMESTRSIZE,fmtstr,tm);
 
puts(timestr);
 
exit(0);
 

查看年份(2位或者4位) 查看小时(不同进制) 带参数的选项

在相应选项后面加上冒号

 
#define FMSTRSIZE 1024
 
int c; //返回值
 
char fmtstr[FMTSTRSIZE];
 
  
 
fmtstr[0]='\0';
 
  
  
  
 
while(1)
 
{
 
c=getopt(argc,argv,"H:MSy:md");//最后一个参数 optstring
 
if(c<0)
 
break;
 
switch(c)
 
{
 
case 'H':
 
if(strcmp(optarg,"12")==0)
 
strncat(fmtstr,"%I(%P)",FMTSTRSIZE);
 
else if(strcmp(optatg,"24")==0)
 
strncat(fmtstr,"%H",FMTSTRSIZE);
 
else
 
fprintf(stderr,"Invalid argument of H\n")
 
break;
 
case 'M':
 
strncat(fmtstr,"%M ",FMTSTRSIZE);
 
break;
 
case 'S':
 
strncat(fmtstr,"%S ",FMTSTRSIZE);
 
break;
 
case 'y':
 
if(strcmp(optarg,"2")==0)
 
strncat(fmtstr,"%y",FMTSTRSIZE);
 
else if(strcmp(optarg,"4")==0)
 
strncat(fmtstr,"%Y",FMTSTRSIZE);
 
else
 
fprintf(stderr,"Invalid argument of -y\n");
 
break;
 
case 'm':
 
break;
 
case 'd':
 
break;
 
default:
 
break;
 
}
 
}
 
strftime(timestr,TIMESTRSIZE,fmtstr,tm);
 
puts(timestr);
 
exit(0);
 

非选项传参可以放在任何地方。前面加一个-号c=getopt(argc,argv,"-H:MSy:md")

返回1值。若指定文件输出到该文件,若没有输出到终端

 
  
 
//初始化
 
FILE *fp=stdout
 
while(1)
 
{
 
  
 
switch(c)
 
{
 
case 1:
 
fp=fopen(argv[optind-1],"w");
 
if(fp==NULL)
 
{
 
perror("fopen()");
 
fp=stdout;
 
}
 
break;
 
}
 
}
 
  
 
strncat(fmtstr,"\n",FMTSTRSIZE);
 
fputs(timestr,fp);
 
  
 
//最后关闭文件
 
if(fp !=stdout)
 
fclose(fp);
 

多个文件 实现先入为主

 
  
 
//初始化
 
FILE *fp=stdout
 
while(1)
 
{
 
  
 
switch(c)
 
{
 
case 1://如果不是stdout 管都不用管了
 
if(fp ==stdout){
 
fp=fopen(argv[optind-1],"w");
 
if(fp==NULL)
 
{
 
perror("fopen()");
 
fp=stdout;
 
}
 
}
 
break;
 
}
 
}
 
  
 
strncat(fmtstr,"\n",FMTSTRSIZE);
 
fputs(timestr,fp);
 
  
 
//最后关闭文件
 
if(fp !=stdout)
 
fclose(fp);