Linux/Unix知识点首页投稿(暂停使用,暂停投稿)程序员

从零开始UNIX环境高级编程(1):Unix基础知识

2017-01-10  本文已影响849人  伤口不该结疤

1. 概述

《UNIX环境高级编程》介绍的是不同版本的Unix操作系统提供的服务。那具体指的是哪些服务呢?首先,需要了解整个Unix操作系统的体系结构。

1.1 Unix体系结构

Unix操作系统的体系结构,如下图所示:

Unix操作系统体系结构

从Unix体系结构可以看出,如果需要使用Unix系统提供的服务,那么必须进行系统调用或者库函数调用。因此,本书介绍的内容就是Unix系统函数和公用库函数的使用方式。

1.2 系统调用和库函数

系统函数和库函数

1.3 Unix程序员手册

我们经常都能看到这种表示: ls(1) write(2) group(5) ... ..

其中括号里面的数字代表手册的区段,Unix程序员手册被分为8个部分,每个部分描述不同的内容。

手册区段

可以通过man命令来查询手册:

man 5 group

2. 登录

2.1 口令文件(/etc/passwd)

用户在登录系统时,需要输入登录名和密码。这些信息都存放在口令文件(通常是/etc/passwd文件)中查看登录名,组成字段信息如下,以逗号隔开。

ckt@ubuntu:~$ cat /etc/passwd
ckt:x:1000:1000:ckt,,,:/home/ckt:/bin/bash

2.2 用户标识

用户ID,组ID和附属组ID用作用户的唯一标识,以区分不同的用户。

用户标识
 ckt@ubuntu:~$ cat /etc/group | grep zhm
 zhm:x:1001:ckt

使用man命令查看/etc/group格式为: group_name:password:GID:user_list


#include "apue.h"

int main(int argc, char const *argv[])
{
    int user_id = -1;
    int group_id = -1;
    user_id = getuid();
    group_id = getgid();
    printf("user_id = %d, group_id = %d \n", user_id, group_id );
    return 0;
}
ckt@ubuntu:~/work/unix/code$ ./a.out 
user_id = 1000, group_id = 1000 

root@ubuntu:/home/ckt/work/unix/code# ./a.out 
user_id = 0, group_id = 0 

2.3 shell

是一种特殊的应用程序,分为command-line interface (CLI) shell和Graphical shell。由/etc/passwd中设置的shell path可以知道,我们使用的shell是Bourne-Again shell。

常见shell

3. 文件和I/O操作

3.1 文件和目录

文件和目录.png

文件描述符

内核用来标识一个特定进程正在访问的文件

#include "apue.h"
#include <fcntl.h>

int main(int argc, char const *argv[])
{
    int file_descr = -1;
    file_descr = open("/home/ckt/work/unix/code/MySignal.c", O_RDONLY);
    printf("file descriptor = %d\n", file_descr);
    return 0;
}

成功打开一个文件时,返回一个非负整数作为文件描述符。打开一个不存在的文件,返回-1。

ckt@ubuntu:~/work/unix/code$ ./a.out 
file descriptor = 3

ckt@ubuntu:~/work/unix/code$ ./a.out 
file descriptor = -1

3.2 输入和输出

输入和输出 Unix环境高级编程 3.9 I/O效率

调用标准I/O函数无需设置buffsize,先将数据读入缓存流,在填满缓存区后才执行对磁盘的I/O磁盘。
标准I/O库提供缓存的目的就是为了尽可能的减少read的调用次数。


不带缓存I/O和标准I/O区别
#include "apue.h"

int main(int argc, char const *argv[])
{
    printf("This Line has been cached...");
    sleep(3);
    printf("\nEnd by line break...\n");
    return 0;
}
示例代码运行效果

修改代码为:printf("This Line has been cached...\n"); 后运行,会立即输出第一句printf。

printf后面加上换行符运行效果

4. 程序及处理

4.1 进程和程序

程序和进程
#include "apue.h"

int main(int argc, char const *argv[])
{
    int values = -1;
    printf("current pid = %d\n", getpid());
    values = fork();
    printf("values return by fork : %d, current pid : %d\n", values, getpid()); 
    return 0;
}
ckt@ubuntu:~/work/unix/code$ ./process_test
current pid = 2622
values return by fork : 2623, current pid : 2622
values return by fork : 0, current pid : 2623

4.2 出错处理

出错处理
#include "apue.h"
#include <errno.h>

int main(int argc, char const *argv[])
{
    printf("The default value of errno : %d\n", errno);
    fprintf(stderr, "%s\n", strerror(EACCES));
    errno = ENOENT;
    perror("printf the last value of errno ");
    return 0;
}
ckt@ubuntu:~/work/unix/code$ ./a.out 
The default value of errno : 0
Permission denied
printf the last value of errno : No such file or directory

4.3 信号

信号

sighandler_t signal(int signum, sighandler_t handler);

#include "apue.h"

void MySigHanlder();

int main(int argc, char const *argv[])
{
    char buf[MAXLINE];
    printf("please input...\n");
    if (signal(SIGINT, MySigHanlder) == SIG_ERR) 
    {

    }
    while (fgets(buf, MAXLINE,stdin) != NULL) 
    {
        printf("please input...\n");
    }
    return 0;
}

void MySigHanlder() 
{
    printf("\nsignal catch by MySigHanlder\n");
}
捕捉ctrl+c 不捕捉ctrl+c

5. Unix时间

Unix时间
ckt@ubuntu:~$ time ls
Android  AndroidStudioProjects  android-x86  ARM_Compiler_5   

real    0m0.006s
user    0m0.000s
sys 0m0.006s

FreeMind

按照书中讲解顺序,附上完整的思维导图。

Unix基础

参考

上一篇下一篇

猜你喜欢

热点阅读