《Unix环境高级编程》6~8章笔记

【第6章        系统数据文件和信息】
一、
<pwd.h>中的passwd结构
/* The passwd structure.  */
struct passwd
{
char *pw_name;            /* Username.  */
char *pw_passwd;          /* Password.  */
__uid_t pw_uid;           /* User ID.  */
__gid_t pw_gid;           /* Group ID.  */
char *pw_gecos;           /* Real name.  */
char *pw_dir;             /* Home directory.  */
char *pw_shell;           /* Shell program.  */
};
/etc/passwd文本文件
#include <sys/types.h>
#icnlude <pwd.h>
struct passwd* getpwuid(uid_t uid);
struct passwd* getpwnam(const char* name);
查看passwd文件
struct passwd* getpwent(void);
void setpwent(void);
void endpwent(void);
影子口令/etc/shadow或者/etc/master.passwd
组文件
/etc/group
#include<sys/types.h>
#include<unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);
int setgroups(int* groups, const gid_tgrouplist[]);
int initgroups(const char* initername, gid_t basegid);
二、
<netdb.h>
主机/etc/hosts
网络(记录网络数据信息的数据文件)/etc/networks
协议/etc/protocols
服务(网络服务器提供的服务的数据文件)/etc/services
get读下一个记录
set打开相应数据文件
end关闭相应数据文件
三、
登录会计:登录和注销事件
/var/adm或者/var/run/utmp /var/log/wtmp
系统标识
#include <sys/utsname.h>
int uname(struct utsname* name)返回系统和主机信息
int gethostname(char* name, int namelen);主机名
四、
时间和日期历程
#include <time.h>
time_t time(time_t* carptr)返回当前日期
struct tm* gmtime(const time_t* carptr)转化为国际标准时间
struct tm* localtime(const time_t* calptr)转化为本地时间
//转化为形如 Tue Jan 14 17:49:03 1992/n/0
char* asctime(const struct tm* calptr)
char* ctime(const time_t calptr);
size_t strftime(char* buf, siz_t maxsize, const char* format, const struct tm* tmptr);格式化时间函数

【第7章        UNIX进程的环境】
一、进程调用main()函数 进程终止的方式
内核->用户进程:“exec()”调用“c起动例程”调用“main()”调用“用户函数”...->调用“exit()”调用“_exit()”退出。
#include <stdlib.h>
void exit(int status);  
#include <unistd.h>
void _exit(int status); //直接进入内核
#include <stdlib.h>
int atexit((void* func)(void));登记函数,exit()以相反的顺序调用,
二、使用环境变量
命令行参数argv[argc] == NULL
环境表 name=value
#include <stdlib.h>
char* getenv(const char* name)       //得到环境变量
未找到返回NULL
int putenv(const char* str);
取"name=value"的形式放入环境表中
int setenv(const char* name, const char* value, int rewrite);
将name设置为value rewrite=0时,删除原来的定义
三、存储器布局
高地址
         命令行参数和环境变量                        
         栈                                         
         ↓
         ...
         ↑
         堆
         未初始化的数据-由exec赋初值0                 bss
         初始化的数据-又exec从程序文件中读到          data
         正文                                         text
低地址
size exec e.g. size /bin/cc /bin/sh
四、分配另外的存储空间
#include <stdlib.h>
void* malloc(size_t size);       //分配但不初始化
void* calloc(size_t nobj, size_t size); //分配后初始化为0 nobj元素个数 size元素大小
原型:extern void *calloc(int num_elems, int elem_size);
用法:#include <alloc.h>
功能:为具有num_elems个长度为elem_size元素的数组分配内存
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
void* realloc(void* ptr, size_t newsize);        //改变(增加,减少)已经分配的长度
失败返回NULL
void free(void* ptr)
跳转 goto语句
#include <setjmp.h>
int longjmp(jmp_buf env) setjmp(jmp_buf env, int val)
跳转时变量的"回滚"
查询和更改进程的资源限制
getrlimit()和setrlimit()

【第8章        进程控制】
一、进程标识——进程ID
非负整数
ID=0 交换进程(swapper)负责调度,内核的一部分,系统进程
ID=1 init进程/etc/init或/sbin/init,读与系统有关的初始化文件/etc/rc*
ID=2 精灵进程(pagedaem on),系统进程
二、fork()
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回:子进程中为0,父进程中为子进程ID,出错为-1
子进程是父进程的复制品;写时复制(Copy-On-Wirte,COW)技术
三、vfork()
#include <vfork.h>
pid_t vfork();
没有copy-on-write,调用exec之前在父进程的空间里运行
四、进程终止
正常终止
       exit()<=>return
异常终止
       abort() 产生SIGABRT信号
终止后将其终止状态返回给父进程,父进程在子进程之前终止则子进程被init进程领养
僵死(zomebie)进程:一个已经终止但其父进程没有对终止的子进程做善后处理(释放子进程占有的资源)的进程。是一种临时的状态
///
main()
{
           for (;;)  /*制作一个死循环*/
           
             fork(); /*开始创建一个子进程*/

}
//
五、wait()函数
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int* statloc);
pid_t waitpid(pid_t pid, int* statloc, int options);
成功返回进程ID,失败-1
WIFEXITED(status)检测进程状态
pid = -1 等待任一子进程
pid > 0 等待其进程与pid相等
pid =0 等待其组ID,等于调用进程的组ID的任一子进程
pid < -1 等待其组ID进程中的绝对值等于pid的进程
options WNOHANG 不阻塞 立即返回 WUNTRACED支持组作业
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
pid_t wait3(int* statloc, int options, struct rusage* rusage);
pid_t wait4(pid_t pid, int* statloc, int options, struct rusage* rusage)
参考手册 getrusage(2)
六、竞争条件
当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竞态条件( race condition)。
定期询问(polling)
while(getppid() != 1)
       sleep(1);
信号机制 和 各种形式的进程间通信(IPC)
///伪代码
        TELL_WAIT();                /* set things up for TELL_XXX & WAIT_XXX */
        if (0 > (pid = fork))
        {
                //fork error
        }
        else if (0 == pid)
        {
                //child does whatever is neccessary ...
                TELL_PARENT(getpid());        //tell parent we are done
                WAIT_PARENT();                        //and wait for parent
                //and child continues on its way ...
                exit(0);
        }
        //parent does whatever is neccessary ...
        TELL_CHILD(pid);        //tell child we are done
        WAIT_CHILD();                //and wait for child
        //and parent continues on its way ...
        exit(0);

七、exec()函数
#include <unistd.h>
int execl(const char* pathname, const char* arg0, ... /*(char*) 0*/);
int execv(const char* pathname, char* constgarv[]);
int execle(const char* pathname, const char* arg0, ... /*(char*)0, char* const envp[]*/);
int execve(const char* pathname, char* const argv[], char* const envp[]);//系统调用
int execlp(const char* filename, const char* arg0, ... /*(char*)0*/);
int execvp(const char* filename, char* const argv[]);
p表示filename做参数, l表示取一个参数表与v互斥,v表示argv[],e表示envp[]
char* const envp[](e.g. "path=/home/jack")
八、更改用户ID和组ID

#include <sys/types.h>
#include <unistd.h>
//设置
int setuid(uid_t uid);
int setgid(gid_t gid);
//切换
int setreuid(uid_t* uid, uid_t euid);
int setregid(gid_t* gid, gid_t egid);
//更改有效id
int seteuid(uid_t uid);
int setgid(gid_t gid);
九、解释器文件
1 解释器文件是一个文本文件
2 起始行形式为!# pathname [optional-agrument]
3 本质:执行起始行的程序并把本身当作参数传递给起始行的那个程序
4 awk

e.g. awkeg
#! awk -f
BEGIN
{
        for(i = 0; i < argv; i++)
                printf "ARGV[%d] = %s", i, ARGV[i]
        exit
}
5 好处:隐藏某些执行文件是用脚本编写的事实;提高效率;可以使用除/bin/sh以外的其他shell来编写shell脚本
十、system函数
#include <stdlib.h>
int system(const char* cmdstring)
系统依赖性很强
e.g. system("date > file");
e.g. system("ls -a");
十一、进程结束后,内核会写一个进程的会计记录
u_short compt 在<sys/acct.h>中

struct acct
{
        char ac_flag;               /* Accounting flags.  */
        u_int16_t ac_uid;               /* Accounting user ID.  */
        u_int16_t ac_gid;               /* Accounting group ID.  */
        u_int16_t ac_tty;               /* Controlling tty.  */
        u_int32_t ac_btime;             /* Beginning time.  */
        comp_t ac_utime;                /* Accounting user time.  */
        comp_t ac_stime;                /* Accounting system time.  */
        comp_t ac_etime;                /* Accounting elapsed time.  */
        comp_t ac_mem;              /* Accounting average memory usage.  */
        comp_t ac_io;               /* Accounting chars transferred.  */
        comp_t ac_rw;               /* Accounting blocks read or written.  */
        comp_t ac_minflt;               /* Accounting minor pagefaults.  */
        comp_t ac_majflt;               /* Accounting major pagefaults.  */
        comp_t ac_swaps;                /* Accounting number of swaps.  */
        u_int32_t ac_exitcode;          /* Accounting process exitcode.  */
        char ac_comm[ACCT_COMM+1];          /* Accounting command name.  */
        char ac_pad[10];                /* Accounting padding bytes.  */
};

accton命令
/sbin/accton filename        turn on
TO DO STH
/sbin/accton        turn off
十二、用户标识
#include <unistd.h>
char* getlogin(void); //得到用户名
十三、进程时间
#include <sys/times.h>
/* Structure describing CPU time used by a process and its children.  */
struct tms
{
        clock_t tms_utime;          /* User CPU time.  */
        clock_t tms_stime;          /* System CPU time.  */

        clock_t tms_cutime;         /* User CPU time of dead children.  */
        clock_t tms_cstime;         /* System CPU time of dead children.  */
};
clock_t times(struct tms* buf)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值