apue第一章 (1)

    技术2022-05-20  62

    开始学习第一章了,不要再好高骛远了,专注一点,记住我的理想是:“让家人生活的更好”

    第一章第一部分笔记:

    1、系统调用就是,计算机操作系统给应用程序提供的服务,比如文件操作,执行新程序,分配内存等。 2、apue的目的即是介绍这些服务。 3、用户登录: 用户的信息存放在/etc/passwd文件中 white@white-desktop:/etc$ cat passwd root:x:0:0:root:/root:/bin/bash ………………………………………….. ………………………………………….. white:x:1000:1000:white,,,:/home/white:/bin/bash junjun:x:1001:1001::/home/junjun:/bin/sh每一行代表一个用户,一共有7个字段,分别为: 用户名,加密口令,数字用户id,数字组id,注释字段,其实目录,登录shell Root     x           0              0          root    /root    /bin/bash 用户的密码没有存放在passwd文件中的,存放在/etc/shadow文件中 当我们使用passwd命令来修改密码时候就在修改shadow文件 修改junjun的密码 white@white-desktop:/etc$ sudo passwd junjun [sudo] password for white: 输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:已成功更新密码 打印出shadow的内容 white@white-desktop:/etc$ sudo cat shadow root:!:14779:0:99999:7::: bin:*:14728:0:99999:7::: white:$6$YRYsy21V$6yqx6fvdlBXbKK9EiE9sMjlhQQ2omR.cEyN3mTrWF2G6JetiVPaqMx5vXr9N0eBiV3/I09jYM2nxg872jrfov0:14779:0:99999:7::: junjun:$6$vL1qIDS8$CuI4KM7dND7sH.mzdUI20dOMy9.8IZBDtbgvoYkznlKn33NuoomVXP9xO7f6Us0GfLotZdHWOFxwfzFjfwwJ5.:15029:0:99999:7::: 在shadow文件中 一行代表一个用户分别为: 用户名:密码(加密了的):上次修改密码的日期:密码不可被修改的天数:密码需要被从新变更的天数 99999表示不需要变更:……… 4、shell    Shell是一个命令解释器,它可以读取用户输入,执行命令,输入可以是从命令行,也可以是文件(脚本文件)。 5、目录文件   Unix的目录是一个单根结构,根目录是”/” ,每一个目录都有一个文件名字,还有些信息:文件类型,权限,等,可以用stat函数修改。文件名中不可以有“/”和 ‘/0’,一般最长文件名师255个字符。 一个ls命令的简单实现 white@white-desktop:/home/junjun/apue/chapter1$ cat 1-1.c /*ls 命令的简单实现*/ #include<dirent.h> #include<sys/types.h> #include<stdio.h> int main(int argc, char * argv[]) {   DIR * dp;   struct dirent * dirp;   if(argc != 2)   {      perror("a single argument (the file name ) is required/n");      return -1;   } if((dp = opendir(argv[1])) == 0) {    ("open file %s error",argv[1]);       return -1; } while((dirp = readdir(dp)) != 0)   printf("%s/n",dirp->d_name); closedir(dp);  return 0; } 5、exit    Exit(0)一般表示正常终止,1-255表示异常终止 6、工作目录    每一个进程都有一个工作目录,也叫当前目录,一般就是应用程序运行时候所在的目录。 例如上面程序生成可执行文件a.out 放在/home/junjun下面,它运行的时候工作目录就是/home/junjun 当输入是$./a.out hello 时候其实相当于输入的是/home/junjun/hello.这在相对路径使用中很方便 可以使用chdir函数修改当前目录。Chdir = change dir. 例如: 7、文件描述符 文件描述符是一个非负整数,代表一个打开的文件。 Shell通常默认打开了三个文件描述符,标准输入,标准输出,标准错误输出 Shell可以将输出重定向到一个文件描述符,例如ls > file.txt 8、输入与输出:    非缓冲的io:read ,write ,lseek,close,需要自己定义一个缓冲区,自己定义缓冲区的大小。 /*不带缓冲的io*/ #include<stdio.h> #include<unistd.h> int main() {   char buf[8192];   int n;   while((n = read(STDIN_FILENO,buf,8192))>0)       if(write(STDOUT_FILENO,buf,n) != n)       {    printf("write error/n");  exit(1);}   if(n < 0 ){printf("read error/n"); exit(2);} } 标准io,标准io有两个好处,一是标准io会自动优化缓冲的大小,不需要像上面那样提供8192的缓冲区大小。二是标准io在处理行上有优势,比如gets自动读取一行的数据。 /*带缓冲的io*/ #include<stdio.h> #include<unistd.h> int main() {   int c;   while((c=getc(stdin))!=EOF)       if(putc(c,stdout) == EOF)       {    printf("puts error/n");  exit(1);}   if(ferror(stdin)){printf("stdin error/n"); exit(2);} } 当getc读到最有一个字符时候返回EOF返回 9、进程 进程控制     进程是运行中的程序的一个实例,进程有一个唯一的数字表示号,叫进程id。 例如:getpid()打印进程id。 进程控制函数大体有 fork exec waitpid三个。fork函数用于生成一个子进程,exec函数可以执行一个程序,waitpid用于检查子进程退出状态。 下面是一个简单的shell层序,从标准输入中读取命令然后执行。 注意:fgets会把回车换行符号读入 /*进程控制:一个简单的shell  从标准输入读命令,并执行命令  */ #include<stdio.h> #include<unistd.h> #include<sys/wait.h> #define MAXLINE 200 int main() {    pid_t pid = 0;    char buf[MAXLINE];    int status;    int i = 0;    printf("%%");    while(fgets(buf,MAXLINE,stdin)!=NULL)    {      /*打印buf 注意fgets要把回车也读进去*/      for(i = 0; i< strlen(buf); i++)       printf("%d-%c ",i,buf[i]);      /*把回车符号除去*/      buf[strlen(buf)-1] = 0;      if((pid = fork()) < 0)  exit(1);      if(pid == 0) //child      {         execlp(buf,buf,(char *)0);     exit(i++);      }      //父进程      //取得子进程的返回状态 防止僵尸进程      if((pid = waitpid(pid,&status,0)) < 0 ) printf("error wait pid ");      printf("%%");      i++;    } }


    最新回复(0)