(四) UNIX环境

来源:互联网 发布:百度竞价推广优化 编辑:程序博客网 时间:2024/06/06 00:01
  • 环境变量的用途

环境变量时一个双刃剑,与命令行相比,他们更隐蔽

环境变量有点象全局变量,他们能够改变程序的行为,引起不可预料的结果

  • UNIX系统时间

格林威治时间1970年1月1日午夜

  • 日期格式转换控制符
%a星期几的简写形式%A星期几的全称%b月份的简写形式%B月份的全称%c日期和时间%d月份中的日期,0-31%H小时,0-23%I12进制小时钟点,01-12%j年份中的日期,001-366%m年份中的月份,01-12%M分,00-59%P上午或下午%s秒,00-61%u星期几,1-7(1代表星期一)%U一年中第几个星期,01-53(星期天是一周的第一天)%V一年中第几个星期,01-53(星期一是一周的第一天)%w星期几,0-6(0代表星期天)%x当地格式的日期%X当地格式的时间%y年份中的最后两位数,00-99%Y年%Z地理时区名称%%

一个"%"字符

  • strftime函数
#include <time.h>#include <stdio.h>int main(){time_t the_time;struct tm *tm_ptr;char buf[256] = {0};(void)time(&the_time);tm_ptr = localtime(&the_time);strftime(buf, 256, "%A %d %B,%I:%S,%P", tm_ptr);printf("strftime gives: %s\n", buf);return 0;}

输出:

strftime gives: Thursday 25 September,12:11,pm
  • 临时文件
#include <stdio.h>int main(){char tmpname[L_tmpnam];char * filename;filename = tmpnam(tmpname);printf("temporary file name is %s\n", filename);filename = mkstemp(tmpname); //原始 mktempprintf("temporary file name is %s\n", filename);return 0;}

返回一个合法的文件名,它与任何现有的文件名都不一样

如果遇到需要立刻用到临时文件,可以用

当该文件上的引用线索都被关闭时,它就会被自动删除

如果我们打算用它,就必须尽快打开这个文件,把另一个程序打开一个同名文件的风险降到最小(所以用到tmpfile)

  • 用户的个人资料

一般情况,用户的UID都大于100

uid_t getuid(void);
函数返回与程序关联的UID,它通常是启动该程序的用户UID
char *getlogin(void);
函数返回与当前用户关联着的登录名

系统文件/etc/passwd里包含着一个与用户账户有关的数据库

里面的账户包括用户名,加密口令字,用户身份标示符(UID),分组标示符(GID),用户的全名,登录子目录以及省略shell

...

  • 与用户资料有关的其他函数
uid_t geteuid(void);gid_t getgid(void);gid_t getegid(void);int setuid(uid_t uid);int setgid(gid_t gid);
  • 主机资料
int gethostname(char *name, size_t len);int uname(struct utsname *name);
  • 日志记录功能
#include <stdio.h>#include <syslog.h>int main(){FILE *f = NULL;f = fopen("hello" ,"r");syslog(LOG_ERR | LOG_USER, "oops - %m\n");return 0;}

/var/log/messages 会记录日志

Sep 26 15:29:48 localhost a.out: oops - No such file or directory
  • 资源和限制
getrusage函数的作用是把CPU时间信息写到由参数r_usage指向的rusage结构里去
int getrusage(int who, struct rusage *usage);
who参数 RUSAGE_SELF只返回当前程序的CPU时间占用信息RUSAGE_CHILDREN还包括子进程的CPU时间占用信息

#include <stdio.h>#include <sys/time.h>#include <sys/resource.h>int main(){struct rusage r_usage;getrusage(RUSAGE_SELF, &r_usage);printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec,r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);return 0;}
CPU usage: User = 0.000000, System = 0.000999
每一个运行中的程序都有一个关联着的优先级,优先级比较高的程序分配到CPU时间会多一点普通用户只能降低自己程序的优先级,不能增加他们
  • 优先级

应用程序可以通过getpriority和setpriority函数确定和改变(或其他程序)的优先级

缺省优先级是0.正优先级用于后台任务,他们只有在没有更高优先级的任务准备运行时才会运行

负优先级会使程序运行的更频繁,从CPU的可用时间分出更大的一块

合法优先级范围是-20到+20

#include <stdio.h>#include <sys/time.h>#include <sys/resource.h>int main(){int priority;priority = getpriority(PRIO_PROCESS, getpid());printf("Current priority = %d\n", priority);return 0;}
  • 资源和限制
getrusage函数的作用是把CPU时间信息写到由参数r_usage指向的rusage结构里去
int getrusage(int who, struct rusage *usage);
who参数 RUSAGE_SELF只返回当前程序的CPU时间占用信息RUSAGE_CHILDREN还包括子进程的CPU时间占用信息

#include <stdio.h>#include <sys/time.h>#include <sys/resource.h>int main(){struct rusage r_usage;getrusage(RUSAGE_SELF, &r_usage);printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec,r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);return 0;}
CPU usage: User = 0.000000, System = 0.000999
每一个运行中的程序都有一个关联着的优先级,优先级比较高的程序分配到CPU时间会多一点普通用户只能降低自己程序的优先级,不能增加他们
  • 优先级

应用程序可以通过getpriority和setpriority函数确定和改变(或其他程序)的优先级

缺省优先级是0.正优先级用于后台任务,他们只有在没有更高优先级的任务准备运行时才会运行

负优先级会使程序运行的更频繁,从CPU的可用时间分出更大的一块

合法优先级范围是-20到+20

#include <stdio.h>#include <sys/time.h>#include <sys/resource.h>int main(){int priority;priority = getpriority(PRIO_PROCESS, getpid());printf("Current priority = %d\n", priority);return 0;}

0 0