1、UNIX基础知识

来源:互联网 发布:淘宝店卖家版官方下载 编辑:程序博客网 时间:2024/06/11 21:03

1、UNIX体系结构
这里写图片描述
    (1)操作系统内核控制硬件资源,调度并提供程序运行环境。
    (2)系统调用即进入内核的接口
    (3)shell(壳,与内核对应)是个特殊的应用程序,为运行其他应用程序提供一个接口
    (4)库函数封装一定的系统调用,为其他应用程序提供一个接口
    (5)应用程序可以使用shell接口,库函数间接使用内核接口,也可以直接通过系统调用进入内核。

2、用户登录
    用户登录对应于口令文件/etc/passwd。用户ID=0是root用户,所有口令文件中包含登录名和用户ID之间的映射关系。

//用户名:口令:用户ID:组ID:注释:其实目录:登录后默认提供的shellyong:x:205:105:kouling:/home/yong:/bin/shftp:x:113:121:ftp daemon,,,:/srv/ftp:/bin/false

3、文件和目录
    斜杠分割路径名,空格终止一个路径名。只有斜杠 / 和空格 不能出现在文件名中。
    创建新目录时会自动创建两个文件名:. 和 .. 一个指向当前目录,一个指向父目录。最高层次的目录则两者一样。
4、myls:读取目录内的文件名,打开目录返回的文件标准符,它指向目录的表项

#include "apue.h"#include <dirent.h>int main(int argc, char *argv[]){        DIR *dp;        struct dirent *dirp;        if(argc != 2)                err_quit("usage: ls directory_name");    //opendir返回指向DIR结构的指针        if((dp = opendir(argv[1])) == NULL)                err_sys("can't open %s", argv[1]);    //readdir返回指向dirent结构的指针        while((dirp = readdir(dp)) != NULL)                printf("%s\n", dirp->d_name);        closedir(dp);        exit(0);}//struct direntstruct dirent  {#ifndef __USE_FILE_OFFSET64    __ino_t d_ino;    __off_t d_off;#else    __ino64_t d_ino;    __off64_t d_off;#endif    unsigned short int d_reclen;    unsigned char d_type;    char d_name[256];           /* We must not include limits.h! */  };//DIRtypedef struct __dirstream DIR;

5、文件描述符,小的非负整数,内核用以标识进程正在访问的文件,内核打开、创建、读写文件时会用到文件描述符。
6、标准输入、输出、错误
    每当运行一个新程序时所有shell都会打开这3个文件描述符。默认都指向终端

//read函数ssize_t read(int fd,void *buf,size_t nbyte); fd:表示从这个文件句柄所代表的文件读取数据。buffer:指缓冲区,即读取的数据会被放到这个缓冲区中去。n: 表示调用一次read操作,应该读多少数量的字符。返回值:返回系统实际所读取的字符数量//write函数ssize_t write(int fd,const void *buf,size_t nbytes) 将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1.
#include "apue.h"#define BUFFSIZE 4096int main(void){        int n;        char buf[BUFFSIZE];    //STDIN_FILENO、STDOUT_FILENO为标准输入输出描述符,值为0,1        while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)        {                if(write(STDOUT_FILENO, buf, n) != 0)                        err_sys("write error");        }        if(n < 0)                err_sys("read error");        exit(0);}$ ./myio <in_data >out_data, 标准输入重定位为文件in_data,输出重定位为out_data

7、出错处理
    errno可以是包含出错号的整数,也可以是一个返回出错编号指针的函数。

//首字母f表示可以指定输出的文件,printf直接输出标准输出int fprintf( FILE *stream, const char *format, ... );指定format(格式)发送信息(参数)到由stream(流)指定的文件.printf(...)=fprintf(stdout,...).返回值:成功则返回输出的字节数,失败返回eof;char *strerror(int errnum);//把errnum值映射为一个出错消息字符串,返回指向字符串的指针void perror(const char *msg);//先输出msg指向的字符串+冒号+空格,再输出前面errno对应的字符串

8、信号

//发生信号SIGINT,需要执行函数sig_int,即信号捕捉signal(SIGINT, sig_int);
#include "apue.h"#include <sys/wait.h>static void sig_int(int);int main(void){    char buf[MAXLINE];    pid_t pid;    int status;    if(signal(SIGINT, sig_int) == SIG_ERR)        err_sys("signal error");    printf("%%");    while(fgets(buf, MAXLINE, stdin) != NULL){         if(buf[strlen(buf) - 1] == '\n')                        buf[strlen(buf) - 1] = NULL;                if((pid = fork()) < 0)                        err_sys("fork error");                else if(pid == 0){                        execlp(buf, buf, (char *)0);                        err_ret("could't execute: %s", buf);                        exit(127);                 }                if((pid = waitpid(pid, &status, 0)) < 0)                    err_sys("waitpid error");                printf("%%");        }        exit(0);}void sig_int(int signo){    printf("interrupt\n%% ");}

9、时间值
(1)时钟时间:进程运行的总时间
(2)用户CPU时间
(3)系统CPU时间:该进程内内核程序经历的时间(如调度线程的时间等)