Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32270
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-27 11:03
文章分类

全部博文(9)

文章存档

2015年(9)

我的朋友

分类: LINUX

2015-11-05 20:26:35

UNIX基础知识
1.1引言
    所有的操作系统都需要向它们运行的程序提供执行新程序、打开文件、读文件、分配存储器及获得当前时间等各种服务

1.2unix体系结构
 
    相邻的层之间,外层可以调用内层的接口  

1.3登陆shell
[coremail@node3 ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
登录名:加密口令:用户ID:组ID:注释:家目录:shell

1.4文件和目录

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.3.c
  2. #include "apue.h"
  3. #include <dirent.h>

  4. int
  5. main(int argc, char *argv[])
  6. {
  7.         DIR *dp;
  8.         struct dirent *dirp;

  9.         if (argc != 2)                            #argc命令行参数的个数
  10.                 err_quit("usage: ls directory_name");

  11.         if ((dp = opendir(argv[1])) == NULL)        #argv数组,用来存放命令行参数;opendir打开一个目录
  12.                 err_sys("can't open %s", argv[1]);   #err_sys & err_quit函数的实现在error.c中
  13.         while ((dirp = readdir(dp)) != NULL)        #readdir读opendir打开的目录下面的每个目录项
  14.                 printf("%s\n", dirp->d_name);

  15.         closedir(dp);
  16.         exit(0);
  17. }
  18. [root@node3 apue.2e]# gcc fig1.3.c
  19. [root@node3 apue.2e]# ./a.out /root/
  20. .ssh
  21. .cshrc
  22. .esd_auth
  23. apue.2e
  24. src.2e.tar.gz
  25. .viminfo
  26. .bash_logout
  27. .gnome2_private
  28. .....
    工作目录:  当前目录  (pwd查看)
    起始目录: 当前用户的家目录


1.5输入和输出
  •     文件描述符:非负数,内核用它来标识一个特定进程正在访问的文件。
  •     标准输出
            标准输入
            标准出错

  •     不带缓冲的I/O的函数:open、read、write、lseek、close(系统不用缓冲,用户使用的时候就要自己加上缓冲

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.4
  2. #include "apue.h"

  3. #define BUFFSIZE 4096

  4. int
  5. main(void)
  6. {
  7.         int n;
  8.         char buf[BUFFSIZE]; #缓冲区的大小

  9.         while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) # 将STDIN_FILENO的数据读到buf中,大小为BUFFSIZE
  10.                 if (write(STDOUT_FILENO, buf, n) != n)
  11.                         err_sys("write error");

  12.         if (n < 0)
  13.                 err_sys("read error");

  14.         exit(0);
  15. }
  16. [root@node3 apue.2e]# mv fig1.4 fig1.4.c
  17. [root@node3 apue.2e]# gcc fig1.4.c
  18. [root@node3 apue.2e]# ./a.out
  19. hello world
  20. hello world
  21. bye
  22. bye

  23. [root@node3 apue.2e]#

注释

STDIN_FILENO        标准输入的文件描述符
STDOUT_FILENO     标准输出的文件描述符

STDERR_FILENO      标准出错的文件描述符
这三个文件描述符都定义在unistd.h ,值分别为0、1、2
[root@node3 apue.2e]# cat /usr/include/unistd.h


  •     重定向操作
  • 带缓冲的I/O的函数:getc、putc、gets、puts、printf(系统自己带缓冲了,用户使用该函数的时候就不用考虑了

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.5
  2. #include "apue.h"

  3. int
  4. main(void)
  5. {
  6.         int c;

  7.         while ((c = getc(stdin)) != EOF)    #getc一次读1个字符
  8.                 if (putc(c, stdout) == EOF)    #putc将字符写到标准输出
  9.                         err_sys("output error");

  10.         if (ferror(stdin))
  11.                 err_sys("input error");

  12.         exit(0);
  13. }
  14. [root@node3 apue.2e]# mv fig1.5 fig1.5.c
  15. [root@node3 apue.2e]# gcc fig1.5.c
  16. [root@node3 apue.2e]# ./a.out
  17. hello world
  18. hello world
  19. bye
  20. bye

  21. [root@node3 apue.2e]#

1.6程序和进程
    程序:存放在磁盘里的可执行文件
    进程:运行起来的可执行程序
    进程ID:每个进程的唯一数字标识符

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.6
  2. #include "apue.h"

  3. int
  4. main(void)
  5. {
  6.         printf("hello world from process ID %d\n", getpid());
  7.         exit(0);
  8. }
  9. [root@node3 apue.2e]# mv fig1.6 fig1.6.c
  10. [root@node3 apue.2e]# gcc fig1.6.c
  11. [root@node3 apue.2e]# ./a.out
  12. hello world from process ID 406
  13. [root@node3 apue.2e]# ./a.out
  14. hello world from process ID 407

    进程控制的主要函数:fork 、exec家族、waitpid

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.7
  2. #include "apue.h"
  3. #include <sys/wait.h>

  4. int
  5. main(void)
  6. {
  7.         char buf[MAXLINE]; /* from apue.h */
  8.         pid_t pid;
  9.         int status;

  10.         printf("%% "); /* print prompt (printf requires %% to print %) */
  11.         while (fgets(buf, MAXLINE, stdin) != NULL) {
  12.                 if (buf[strlen(buf) - 1] == '\n')
  13.                         buf[strlen(buf) - 1] = 0; /* replace newline with null */

  14.                 if ((pid = fork()) < 0) {
  15.                         err_sys("fork error");
  16.                 } else if (pid == 0) { /* child */
  17.                         execlp(buf, buf, (char *)0);    #子进程调用execlp执行从标准输入读入的命令
  18.                         err_ret("couldn't execute: %s", buf);
  19.                         exit(127);
  20.                 }

  21.                 /* parent */
  22.                 if ((pid = waitpid(pid, &status, 0)) < 0)    #waitpid函数返回子进程的终止状态(status变量)
  23.                         err_sys("waitpid error");
  24.                 printf("%% ");
  25.         }
  26.         exit(0);
  27. }
  28. [root@node3 apue.2e]# mv fig1.7 fig1.7.c
  29. [root@node3 apue.2e]# gcc fig1.7.c
  30. [root@node3 apue.2e]# ./a.out
  31. % pwd
  32. /root/apue.2e
  33. % ls
  34. advio fig12.11 fig16.16 fig18.11 fig5.4 figC.20
  35. a.out fig12.12 fig16.17 fig18.12 fig5.5 figC.21
  36. call fig12.13 fig16.18 fig18.13 fig6.2 figC.3

    线程:资源执行的基本单位(线程可以共享同一地址空间、文件描述符、栈、进程相关的属性)
    线程ID:唯一地标识了一个进程的线程,它只在所属进程中有效,一个进程的线程ID到了另一个进程中毫无意义

1.7出错处理
  • 出错处理
    当UNIX函数出错时常常返回一个负值,并把全局的整型变量errno设置为含有附加信息的一个值,常见值可以查看errno-base.h
    [root@node3 apue.2e]# vi /usr/include/asm-generic/errno-base.h 

    #include   
    char *strerror(int errnum);
    返回值:指向消息字符串的指针
    解析:通过全局变量errno的值获取出错消息,每种出错都对应于相关的出错提示信息,当调用该接口函数时,可以把相应出错号的出错提示信息返回给调用者
    示例:

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat strerror.c
  2. #include <apue.h>

  3. int
  4. main(void)
  5. {
  6.         int fd;
  7.         extern int errno;

  8.         if ((fd = open("/dev/dsp",'w')) < 0)
  9.         {
  10.                 printf("error = %d\n",errno);
  11. // errno = 13;
  12.                 char *mesg = strerror(errno);
  13.                 printf("Mesg: %s\n",mesg);
  14.         }
  15.         exit(0);
  16. }
  17. [root@node3 apue.2e]# gcc strerror.c
  18. [root@node3 apue.2e]# ./a.out
  19. error = 22
  20. Mesg: Invalid argument
    #include   
    void perror(const char *msg);
    解析:该函数首先输出msg指向的字符串,然后输出一个冒号,一个空格,接着是对应于当前的errno值对应的出错信息。

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat perror.c
  2. #include "apue.h"

  3. int
  4. main(void)
  5. {
  6.         FILE *fp;
  7.         fp = fopen("/root/nonexistfile","r+");
  8.         if (NULL == fp)
  9.         {
  10.                 perror("/root/nonexistfile");
  11.         }
  12.         return 0;
  13. }

  14. [root@node3 apue.2e]# gcc perror.c
  15. [root@node3 apue.2e]# ./a.out
  16. /root/nonexistfile: No such file or directory

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.8
  2. #include "apue.h"
  3. #include <errno.h>

  4. int
  5. main(int argc, char *argv[])
  6. {
  7.         fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
  8.         errno = ENOENT;
  9.         perror(argv[0]);
  10.         exit(0);
  11. }
  12. [root@node3 apue.2e]# mv fig1.8 fig1.8.c
  13. [root@node3 apue.2e]# gcc fig1.8.c
  14. [root@node3 apue.2e]# ./a.out
  15. EACCES: Permission denied
  16. ./a.out: No such file or directory

1.8用户标识
    用户ID(第三个字段)

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. ....
    组ID(第四个字段)

点击(此处)折叠或打开

  1. [root@node3 apue.2e]# cat fig1.9
  2. #include "apue.h"

  3. int
  4. main(void)
  5. {
  6.         printf("uid = %d, gid = %d\n", getuid(), getgid());
  7.         exit(0);
  8. }
  9. [root@node3 apue.2e]# mv fig1.9 fig1.9.c
  10. [root@node3 apue.2e]# gcc fig1.9.c
  11. [root@node3 apue.2e]# ./a.out
  12. uid = 0, gid = 0

阅读(1117) | 评论(0) | 转发(0) |
0

上一篇:APUE准备环境

下一篇:Unix环境高级编程二

给主人留下些什么吧!~~