2015-12-19 22:45:55 wp1603710463 阅读数 1636

                                                                    Linux-Unix系统编程手册学习笔记

                                                                 — —Michael Kerrisk 著

1. Linux专有编程特性:

   ⑴ epoll,获取文件I/O事件通知的一种机制。

   ⑵ inotify,监控文件和目录变化的一种机制。

   ⑶ capabilities,为进程赋予超级用户的部分权限的一种机制。

   ⑷ 扩展属性。

   ⑸ i-node标记。

   ⑹ clone()系统调用。

   ⑺ /proc文件系统。

   ⑻ 在文件I/O、信号、定时器、线程、共享库、进程间通信以及套接字方面,Linux所专有的实现细节。

 

2. Linux下的进程通信通信机制主要包括:

   ⑴管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

   ⑵信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

    ⑶报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    ⑷共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

    ⑸信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

    ⑹套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

    ⑺文件锁定:为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定。

 

3.执行文件I/O操作的4个主要系统调用:

    ⑴fd=open(pathname,flags,mode)函数打开pathname所标识的文件,并返回文件描述符,用以在后续函数调用中指代打开的文件。如果文件不存在,open()函数可以创建之,这取决于对位掩码参数flags的设置。flags参数还可以指定文件的打开方式:只读,只写亦或是读写方式。mode参数则指定了由open()调用创建文件的访问权限,如果open()函数并未创建文件,那么可以忽略mode参数。

    ⑵numread=read(fd,buffer,count)调用从fd所指代的打开文件中读取至多count字节的数据,并存储到buffer中。read()调用的返回值为实际读取到的字节数。如果再无字节可读,则返回值为0。

   ⑶numwritten=write(fd,buffer,count)调用从buffer中读取多达count字节的数据写入由fd所指代的已打开文件中。write()调用的返回值为实际写入文件中的字节数,且有可能小于count。

   ⑷status=close(fd)在所有输入/输出操作完成后,调用close(),释放文件描述符fd以及与之相关的内核资源。
2019-11-06 11:01:10 Mr_Xuf 阅读数 39

给各位学习Linux或是UNIX的亲推荐一本书,书名叫做《Linux/UNIX系统编程手册》这本书分为上册和下册两部分,本书描述精到,示例周详,涵盖了 Linux 底层 API 编程的详尽内容及个中细微之处。十分不错。英文名称为《The Linux Programming Interface》或为《THE LINUX PROGRAMMING INTERFACE》中文版。


 

本书的下载链接是:(上下册高清带书签的二合一版本)

 

其他相关免费资料下载链接:https://blog.csdn.net/Mr_Xuf/article/details/102568882

 

2020-01-07 23:49:15 qq_42055033 阅读数 25

linux/unix基本概念

1. 操作系统的内核

在广义情况下:内核是指完整的软件包,包括计算机核心层软件,以及所有的附带 标准工具:如命令解释器,图形用户界面,文件操作工具和文本编辑器等。

在侠义情况下:内核就是指管理计算机资源(CPU,RAM和设备)的核心层软件。

本书中的内核为狭义的内核

  1. 内核的职责
    1. 进程调度:linux为抢占式多任务操作系统,多任务指同时可以有多个进程驻留于内存之中,抢占是指操作系统内核对每个进程占用CPU时间的分配。
      进程本身对于自己何时执行,执行多长时间毫不知情
    2. 内存管理:采用和windows类似的虚拟内存管理技术(计算机历史上最为成功的抽象技术之一) ,主要有一下两个优点。
      1. 进程与进程之间,进程与内核之间彼此隔离,因此一个进程无法直接读取或修改内核或其他进程的内容。
      2. 提供了虚拟内存(就是可以将部分磁盘空间当做内存处理),保证了CPU在任意时刻都有进程执行,它使得应用程序认为它拥有连续可用的内存,但实际上,它通常是被分割为多个物理内存碎片,还有部分暂时存储在外部的磁盘存储器上,需要时进行数据交换。linux提供的“交换空间”通常就是被视为虚拟内存的磁盘空间。
    3. 提供了文件系统:文件系统的存在可以方便的对存在于磁盘上的文件进行创建,删除,修改,检查的功能,文件系统本身也是计算机历史上最重要的抽象概念之一。
    4. 创建和终止进程:内核可以将可执行文件加载如内存,并为其提供所需的资源,进程执行完毕后,内核还可以释放占用的全部资源。
    5. 内核既为程序的访问设备提供了简化的标准接口,还仲裁多个进程对每一个设备的访问。
    6. 联网:内核可以以进程的名义收发网络数据
    7. 提供系统调用接口:进程可以利用内核提供的接口去请求内核执行各种任务

操作系统的本质就是一种特殊的软件:一般来说,只要有进程管理和内存管理就可以叫做操作系统了。

  1. 内核态和用户态 :现代CPU至少可以被分为两种状态:用户态和内核态,操作系统为了合理使用CPU的两个状态,将虚拟内存分为了用户态和内核态。内核态的CPU可以访问用户态和内核态的进程虚拟内存,用户态的CPU只可以访问用户态的进程虚拟内存。
    仅当处理器处于核心态时,才可执行某些位于虚拟内存内核态的操作,比如关机,硬件管理,进程管理等。

2. shell

命名解释器,shell的命令就是人机交互,同时执行一些脚本

3.文件I/O模型

  1. 在linux系统中一切皆文件,且同一套系统调用(open,read,write,close等)所执行的I/O操作,可作用于所有的文件系统,比如套接字。因为应用程序发起I/O请求,内核会将其转化为相应的文件系统操作,就本质而言,内核只提供一种文件类型:字节流序列。

  2. stdio库:C语言在执行I/O操作时,往往会调用C语言的标准输入输出库,其中包括(fopen,fclose,scanf,printf,fgets,fputs)。

  3. 对于进程来说,许多事情的生都无法预期,进程不知道自己何时开始,结束占据CPU,不知道自己在物理内存和交换空间中的实际位置,不知道外部信号的来历,等等。进程仅仅是一个孤岛,对于整个体系的把控完全依赖于内核。

  4. 进程的内存布局

    1. 文本:程序的指令
    2. 数据:程序使用的静态变量
    3. 堆:程序可以从该区域动态分配额外内存
    4. 栈:随函数调用,返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。
  5. 创建进程执行程序
    进程可以调用fork()来创建。父进程调用fork函数来创建子进程,子进程可以将父进程的文本,数据,堆,栈复制过来(内存中标记为只读的部分则由父,字进程共享)。
    当然,execve函数可以去加载一个全新的程序,execve函数会销毁现有的文本段,数据段,堆,栈,根据新程序创建一个新段来替换它们。

  6. 进程终止和终止状态:可以使用以下两种方式来终止一个进程

    1. 调用相关的exit()库函数
    2. 向进程传递信号(最常用kill命令)
  7. 守护进程:指具有特殊用途的进程,进程创建和处理此类的进程的方式和其他进程相同,但以下特征是其所独有的,守护进程的例子有(syslogd,在系统日志中记录消息,httpd,利用HTTP分发web页面)

    1. “长生不老"。守护进程通常在系统引导时启动,直到系统关闭时生命周期才会结束。
    2. 守护进程在后台运行,且无控制终端供其读取或写入数据。
  8. init进程:系统引导时会创建最初的进程,名叫init进程,是所有进程之父。init的进程号为1,且总以超级用户的权限运行,只有关闭了系统init进程才会终止,init的任务是创建并监控系统运行所需的一系列进程

4. 进程间的通信及同步

Linux系统上运行有多个进程,其中许多都是独立运行的,然而,进程间的通信(IPC)和同步是完成某些任务的必要机制。
读写磁盘文件中的信息是进程间通信的方法之一。可是,对许多程序员来说,这种方法既满又缺乏灵活性。因此,linux也提供了丰富的进程间通信的机制。

  1. 信号(signal):用来表示事件的发生
  2. 管道和FIFO:用于在进程间传递数据
  3. 套接字:供一台主机或是互联网的不同主机上所运行的进程之间传递信息。
  4. 文件锁定:防止其他进程读取或更新文件的内容,允许某进程对文件的部分区域加以锁定。
  5. 消息队列:允许在进程间交换消息(数据包)
  6. 信号量:用来同步进程动作
  7. 共享内存:允许两个及两个以上的进程共享一块内存,当某进程改变了共享内存的内容时,其他进程会立刻了解这一个变化。

5. 信号

尽管上一节将信号视为IPC的方法之一,但信号是一种广泛应用的操作。
人们往往将信号称为”软件中断“,进程收到信号,就意味着有事情要发生。
kill命令即可发出信号,kill本事发信号的命令,但是它发的大多数信号可以杀死进程,所有就起了(kill这个名字)

6.文件系统 /Proc

/Proc是一种虚拟文件系统,为内核提供了一个方便控制所有文件的接口,使操作系统内核可以方便的查看,修该各种属性。

2019-06-01 12:04:05 qq_39965097 阅读数 18

Linux/unix系统编程手册-第四章 文件I/O 笔记(1)

  • 所有执行I/O操作的系统调用都以文件描述符,一个非负整数(通常是小整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。针对每个进程,文件描述符都自成一套。

  • 在程序运行之前,shell代表程序打开3种标准的文件描述符。程序继承了shell文件描述符的副本,在shell日常操作中,这三个文件描述符是时钟打开的。在交互式shell中,这三个文件描述符通常指向shell运行所在的终端。如果命令行指定对输入/输出进行重定向操作,那么shell会对文件描述符做适当修改,然后再启动程序。

文件描述符 用途 POSIX名称 stdio流
0 标准输入 STDIN_FILENO stdin
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr
  • 在程序中指代这些文件描述符时,可以用数字(0、1、2)表示,或者采用<unistd.h>所定义的POSIX标准名称(这种方法较好)。

  • 文件I/O操作的4个主要系统调用:

    • fd = open(pathname, flags, mode)函数打开pathname所标识的文件,并返回文件描述符fd,用以在后续函数调用中指代打开的文件。如果文件不存在,open()函数可以创建要打开的文件,但是这取决于flags参数。flags参数表示以何种方式打开文件:只读、只写、读写。mode参数则指定由open()函数所创建的文件的访问权限;如果open()函数并未创建文件,则该参数可不指定。

    • numread = read(fd, buffer, count)调用从fd指代的打开文件中读取之多count字节的数据,并存储到buffer中。该函数的返回值为实际读取到的字节数。如果再无字节可读(如读到文件结尾符EOF时),则返回值为0。

    • numwritten = write(fd, buffer, count)调用从buffer中读取多达count字节的数据写入由fd指定的文件中。该函数返回值为实际写入文件中的字节数,且有可能小于count值。

    • status = close(fd)函数表示在所有输入/输出操作完成后,释放文件描述符fd以及与之有关的内核资源。


/*
** 实现将源文件内容复制到新文件中
** ./4-1-copy oldfile newfile
** 将oldfile内容复制到newfile中
*/

/*获取有关文件状态的函数*/
#include <sys/stat.h>
/*包含文件操作的函数*/
#include <fcntl.h>
/*包含书中提供的头文件(该同文件包含一些标准操作)*/
#include "../lib/tlpi_hdr.h"

/*定义缓存区大小*/
#ifndef BUF_SIZE
#define BUF_SIZE 1024
#endif

int main(int argc, char const *argv[])
{
	int inputFd, outputFd, openFlags;//文件描述符,文件描述符,打开文件标志
	mode_t filePerms;//文件权限,创建文件时使用;底层为unsigned int类型
	ssize_t numRead;//读取文件长度
	char buf[BUF_SIZE];//缓存

	if (argc != 3 || strcmp(argv[1], "--help") == 0)
	{
		usageErr("%s old-file new-file\n", argv[0]);
	}

	/*打开源文件*/
	inputFd = open(argv[1], O_RDONLY);
	if (-1 == inputFd)
	{
		errExit("opening file %s", argv[1]);
	}

	/*打开文件的主标志:O_RDONLY只读;O_RDWR可读可写;O_WRONLY只写*/
	/*打开文件的副标志:O_APPEND,读写文件从文件尾部开始移动,所写入的数据追加到文件尾部*/
	/*O_TRUNC,若文件存在并且以可写方式打开时,此标志会将文件长度清0,原有数据消失*/
	/*O_CREAT,若路径中的文件不存在则自动建立该文件*/
	/*O_EXCL,如果与O_CREAT同时设置,此标志会是能检查文件是否存在,文件不存在则建立文件
	**否则将导致打开文件错误。若同时设置打开的时文件为符号链接文件,则将导致打开文件失败*/
	/*主标志之间是互斥的,可配合使用副标志*/
	openFlags = O_CREAT | O_WRONLY | O_TRUNC;
	/*文件权限标志:S_IRUSR,所有者拥有读权限;
	*S_IWUSR,所有者拥有写权限;
	*S_IXUSR,所有者拥有执行权限;
	*S_IRGRP,群组拥有读权限;
	*S_IWGRP,群组拥有写权限;
	*S_IXGRP,群组拥有执行权限;
	*S_IROTH,其他用户拥有读权限;
	*S_IWOTH,其他用户拥有写权限;
	*S_IXOTH,其他用户拥有执行权限;
	*正好就是Linux中指定的文件权限
	*/
	/*文件权限:rw-rw-rw-*/
	filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |\
				S_IROTH | S_IWOTH;

	/*打开或创建要写入的文件*/
	outputFd = open(argv[2], openFlags, filePerms);
	if (-1 == outputFd)
	{
		errExit("opening file %s", argv[2]);
	}

	/*将源文件的内容读到缓存,然后写入目标文件*/
	while((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
	{
		if (write(outputFd, buf, numRead) != numRead)
		{
			fatal("could't write whole buffer");
		}
	}

	if (numRead == -1)
	{
		errExit("read");
	}

	if (close(inputFd) == -1)
	{
		errExit("close input");
	}
	if (close(outputFd) == -1)
	{
		errExit("close output");
	}

	exit(EXIT_SUCCESS);
	//return 0;
}

2015-05-15 13:15:42 chengying332 阅读数 1221

《Linux/UNIX系统编程手册(上、下册)》


《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权威著作。Linux编程资深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。《Linux/UNIX系统编程手册(上、下册)》涵盖了逾500个系统调用及库函数,并给出逾200个程序示例,另含88张表格和115幅示意图。
《Linux/UNIX系统编程手册(上、下册)》总共分为64章,主要讲解了高效读写文件,对信号、时钟和定时器的运用,创建进程、执行程序,编写安全的应用程序,运用POSIX线程技术编写多线程程序,创建和使用共享库,运用管道、消息队列、共享内存和信号量技术来进行进程间通信,以及运用套接字API编写网络应用等内容。
《Linux/UNIX系统编程手册(上、下册)》在汇聚大批 Linux专有特性(epoll、inotify、/proc)的同时,还特意强化了对UNIX标准(POSIX、SUS)的论述,彻底达到了“鱼与熊掌,二者得兼”的效果,这也堪称本书的最大亮点。
《Linux/UNIX系统编程手册(上、下册)》布局合理,论述清晰,说理透彻,尤其是作者对示例代码的构思巧妙,独具匠心,仔细研读定会受益良多。本书适合从事Linux/UNIX系统开发、运维工作的技术人员阅读,同时也可作为高校计算机专业学生的参考研习资料。


详细解读 和小伙伴们一起来吐槽


UNIX系统编程(2)

阅读数 2256

linux/unix系统编程

阅读数 937

没有更多推荐了,返回首页