第四章 Linux环境

时间:2023-01-01 12:12:06

程序参数

int main(int argc , char *argv[])

argc是程序参数的个数,argv是代表参数的字符串数组。

以下对参数检查:

//args.c
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ int arg; for(arg=0;arg<argc;arg++){ if(argv[arg][0] == '-'){ printf("option:%s\n",argv[arg]+1); }else{ printf("argument %d: %s\n",arg,argv[arg]); } } exit(0); }

带参数执行

wuchao@:~/linux_program/CH04$ ./args -i -lr 'hi there' -f abc
argument 0: ./args
option:i
option:lr
argument 3: hi there
option:f
argument 5: abc

getopt

#include<unistd.h>
int getopt(int agrc,char *const argv[],const char *optstring)
extern char *optarg;
extern int optind,opterr,optopt;

该函数将传递给程序的main函数的argc和argv作为参数,同时接收一个字符串optstring,该字符串告诉getopt哪些选项可用,以及它们是否有关联值。

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

函数解释:

循环调用getopt可以依次获得所有选项

1. 如果选项有一个关联值,则外部变量optarg指向这个值

2. 如果选项处理结束,getopt返回-1,特殊参数--将使getopt停止扫描选项

3. 若遇到无法识别的选项,getopt返回“?”,并保存到optopt中

4. 如果选项要求有关联值,但用户未提供,getopt返回"?"。如果选项字符串第一个字符为冒号,那么getopt在用户为提供值的情况下返回冒号而不是问号。

5. optind保存待处理参数的索引

以下程序,设选项为‘-i’,'-l','-r','-f',其中f选项后面需要一个参数,并设置未提供参数时,返回“:”

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
    int opt;
    while((opt = getopt(argc,argv,":if:lr")) !=-1 ){
        switch(opt){
            case 'i':
            case 'l':
            case 'r':
                printf("option:%c\n",opt);
                break;
            case 'f':
                printf("filename:%s\n",optarg);
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?':
                printf("unknown option:%c\n",optopt);
                break;        
        }
    }
    for(;optind<argc;optind++){
        printf("argument:%s\n",argv[optind]);
    }
    exit(0);
}

执行

wuchao@:~/linux_program/CH04$ ./argopt -i -lr 'hi here' -f fred.c -q
option:i
option:l
option:r
filename:fred.c
unknown option:q
argument:hi here

环境变量

#include<stdlib.h>
char *getenv(const char *name);
int putenv(const char *string);

getenv函数以给定的名字搜索,返回字符串。如果变量不存在,返回null,如果存在但无关联值,返回空字符串。

putenv参数以“名=值”的字符串给定。失败返回-1。

时间

#include<time.h>
time_t time(time_t *tloc);

如果tloc不是空指针,time还会把返回值写入tloc。

#include<time.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
    time_t timeNow = time((time_t *)0);
    printf("Current time is %ld;\n",timeNow);
}

执行

wuchao@:~/linux_program/CH04$ ./time
Current time is 1476760726;

用户信息

#include<sys/types.h>
#include<unistd.h>
uid_t getuid(void);
char *getlogin(void);

getuid返回程序关联的UID,一般为当前用户的UID。

getlogin返回当前用户的登录名。

 

#include<sys/types.h>
#include<pwd.h>

struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);

passwd结构体如下:

char *pw_name:用户登录名

uid_t pw_uid:UID

gid_T pw_gid:GID

char *pw_dir:用户家目录

char *pw_gecos:用户全名

char *pw_shell:用户默认shell

主机信息

#include<unistd.h>
int gethostname(char *name,size_t namelen);

把机器的网络名写入name中,该字符串至少有namelen个字符长。