![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记-Unix环境高级编程
文章平均质量分 61
张勇1234
这个作者很懒,什么都没留下…
展开
-
2、UNIX标准及实现
一、标准,实现 1、ISO C:现今所有UNIX操作系统都支持C标准库中定义的库函数。2、IEEE POSIX(可移植操作系统接口):定义了接口而非实现,这些接口包括:系统接口定义、命令和实用程序。3、Open Group的Single UNIX Specification:它定义了附加接口扩展POSIX.1规范提供的功能,POSIX.1的系统接口(X/Open System Interface,原创 2017-09-17 12:29:51 · 273 阅读 · 0 评论 -
12、信号(2)
1、信号被屏蔽后无法捕获,但是没有消失,5s后恢复则立即捕获到#include "apue.h"static void sig_quit(int);int main(void){ sigset_t newmask, oldmask, pendmask; if(signal(SIGQUIT, sig_quit)==SIG_ERR)原创 2017-10-15 10:17:34 · 253 阅读 · 0 评论 -
11、信号(1)
1、进程调用kill函数将任一信号发送给另一进程或进程组。当信号出现可以告诉内核以3种方式处理:(1)忽略信号;(2)捕捉信号,kill默认发送的是SIGTERM终止信号,不能捕获SIGKILL和SIGSTOP信号;(3)执行系统默认动作,“终止+core”表示在进程当前工作目录的core文件中复制了该进程的内存映像。大多数UNIX系统调试程序都使用core文件检查进程终止时的状态。2、signal原创 2017-10-13 09:24:14 · 1164 阅读 · 0 评论 -
16、守护进程
1、SID:会话ID,即会话首进程ID。父进程为0的各进程通常是内核进程,内核进程存在于系统的整个生命周期,以root权限允许,无控制终端,无命令行。2、Linux使用kthreadd内核进程来创建其他内核进程。init PID=1,是系统守护进程,负责启动各运行层次特定的系统服务。inetd负责侦听网络接口,以便取得来自网络的各种网络服务进程的请求。cron守护进程在定期安排的日期和时间执行命令。原创 2017-10-18 14:48:31 · 175 阅读 · 0 评论 -
17、高级IO
1、低速系统调用是可能会使进程永远阻塞的一类系统调用,包括: (1)管道、终端设备和网络设备等文件的数据不存在,读操作可能会使调用者永远阻塞。 (2)数据不能被相同的文件类型立即接受(如管道中无空间、网络流控制),写操作可能会使调用者永远阻塞。 (3)在某些条件之前打开某些文件类型可能会发生阻塞。 …. 2、非阻塞IO使我们可以发出open、read和write这样的IO操作,并使这些操作原创 2017-10-21 16:20:56 · 145 阅读 · 0 评论 -
18、进程间通信IPC(1)
1、IPC包括:管道、FIFO、消息队列、信号量、共享存储以及套接字机制的网络IPC。 2、每当在管道中键入一个命令序列,让shell执行时,shell都会为每一条命令单独创建一个进程,然后用管道将前一条命令进程的标准输出与后一条命令的标准输入相连接。//创建管道,fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。int pipe(int fd[2]); 3、po原创 2017-10-22 14:19:41 · 223 阅读 · 0 评论 -
22、高级进程间通信
1、UNIX域套接字-在同一计算机系统上运行的两个进程之间传送打开文件描述符。仅仅复制数据不需要执行协议处理。消息队列不能和poll或者select一起使用(只要多个消息队列中一个消息发生)。//创建一对无命名的、相互连接的UNIX域套接字,可以起到全双工管道的作用int socketpair(int domain, int type, int protocol, int sockfd[2]);2原创 2017-11-01 16:52:02 · 395 阅读 · 0 评论 -
23、终端IO和伪终端
1、终端设备由位于内核的终端驱动程序控制。每个终端设备都有一个输入队列和输出队列。如果打开了回显功能,则在输入队列和输出队列之间有一个隐含的连接。当输出队列要填满时,内核便直接使写进程休眠,直到写队列中有可用的空间。 2、终端行规程位于读写函数和实际设备驱动程序之间,进行规范处理。//检查和更改终端设备特性struct termios{ tcflag_t c_iflag;//输入标志,预原创 2017-11-02 11:33:41 · 337 阅读 · 0 评论 -
20、网络IPC:套接字(1)
1、套接字是通信端点的抽象。//创建套接字,成功则返回描述符int socket(int domain, int type, int protocol);(1)domain域确定通信的特性,如地址格式,AF=address familyAF_INET IPv4因特网域AF_INET6 IPv4因特网域AF_UNIX UNIX域AF_UNSPEC 未指定(2)typ原创 2017-10-25 20:25:47 · 217 阅读 · 0 评论 -
19、进程间通信(2)
1、3种被称为XSI IPC的IPC:信号量、消息队列、以及共享存储器。每个IPC结构都用一个非负整数的标识符加以引用。每个对象都与一个键key相关联,这个键作为对象的外部名。使客户进程和服务器进程在同一IPC上汇聚的方法: (1)服务器进程指定键IPC_PRIVATE创建一个新IPC结构,将返回的标识符存放在某处(如一个文件)以便客户进程取用。 (2)在一个公共头文件中定义一个客户进程和服务器原创 2017-10-24 09:47:18 · 137 阅读 · 0 评论 -
13、线程(1)
1、多个进程使用操作系统提供的复杂机制才能实现内存和文件描述符的共享。每个线程都包含有表示执行环境所必须的信息,其中包括进程中标志线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都是共享的,包括执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。2、线程ID只有在它所属的进程上下文中才有意义。Linux使用无符原创 2017-10-15 16:21:28 · 124 阅读 · 0 评论 -
14、线程(2)
1、带超时的互斥量//等待的时间是绝对时间int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);2、读写锁 写加锁只有一个线程可以,读加锁所有线程都可以(读加锁后在想写加锁不可以)。//初始化静态分配定义PTHREAD_RWLOCK_INITIALI原创 2017-10-16 20:14:15 · 165 阅读 · 0 评论 -
10、进程关系
1、终端登录 本地和远程登录都经内核中的终端设备驱动程序。 (1)本地终端登录 终端设备文件中,每个终端设备都有一行,每一行说明设备名和传到getty程序的参数。 系统自举时,init进程(ID=1)使系统进入多用户模式,读取终端设备文件,对每一个允许登录的终端设备调用一次fork,生成的子进程exec getty程序(以空环境运行)。此时所有进程的实际用户ID和有效用户ID原创 2017-10-10 20:03:16 · 196 阅读 · 0 评论 -
9、进程控制(2)
1、实际用户ID是用户登录时,由login程序设置的,login是一个超级用户进程。只有对程序文件设置了设置用户ID位时,exec函数才设置有效用户ID,即exec可以改变有效用户ID。保存的设置用户ID从有效用户ID复制得到。 普通用户可以将其有效用户ID设置为其实际用户ID或保存的设置用户ID。(自己设置自己)//设置有效ID#include <unistd.h>int seteuid原创 2017-10-08 15:36:12 · 184 阅读 · 0 评论 -
8、进程控制(1)
1、进程ID总是唯一的,常将其作为其他标识符的一部分以确保其唯一性。一个进程结束后ID可以复用,一般采用延迟复用法。ID为0是调度进程(交换进程),是内核的一部分属于系统进程。ID=1是init进程,在内核自举后启动UNIX系统,他通常读取与系统相关的初始化文件(/etc/rc*,/etc/inittab,/etc/init.d中文件等)。init进程不会停止,虽然是普通进程却是以root权限允许。原创 2017-09-28 22:07:37 · 183 阅读 · 0 评论 -
6、系统数据文件和信息
对于每个数据文件至少包含3个函数:get(读下一个记录),set,end 1、根据口令文件(/etc/passwd)得到passwd结构(/usr/include/pwd.h)struct passwd{ char *pw_name; /* Username. */ char *pw_passwd; /* Password. *原创 2017-09-26 22:04:29 · 233 阅读 · 0 评论 -
read、write系统调用与IO库函数
在系统调用的函数中有STDIN_FILENO,和STDOUT_FILENO,STDERR_FILENO,分别对应标准输入(一般使键盘),标准输出(一般使显示器),标准错误,(他们都是非负整数,属于文件描述符)一般在老程序中也将他们分别用0,1,2代替,但建议还是使用他们的别名。而在标准IO函数中还有stdin,stdout,stderr等是FILE *类型,使属于文件指针,属于标准I/O,高级的输入转载 2017-09-27 11:24:39 · 1454 阅读 · 1 评论 -
15、线程控制
1、属性对象对应用程序来说是不透明的。这意味着应用程序并不需要了解相关属性对象的内部结构的详细细节,这增加了应用程序的可移植性。取而代之的是,需要提供相应的函数来管理这些属性对象。2、线程属性int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);//线程状态:分离还是可获原创 2017-10-17 14:19:21 · 135 阅读 · 0 评论 -
mmap和read、write
在介绍mmap和read/write之前,首先先要介绍一下基础知识,其中包括磁盘,文件系统,内存。 首先说一下文件系统,linux文件系统的三层结构想必大家多少都了解一些,每个进程中都有一个用户文件描述符表,表项指向一个全局的文件表中的某个表项,文件表表项有一个指向内存inode的指针,每个inode唯一标识一个文件。如果同时有多个进程打开同一文件,他们的用户文件描述符表项指向不同的文件转载 2017-10-21 22:44:07 · 458 阅读 · 0 评论 -
1、UNIX基础知识
1、UNIX体系结构 (1)操作系统内核控制硬件资源,调度并提供程序运行环境。 (2)系统调用即进入内核的接口 (3)shell(壳,与内核对应)是个特殊的应用程序,为运行其他应用程序提供一个接口 (4)库函数封装一定的系统调用,为其他应用程序提供一个接口 (5)应用程序可以使用shell接口,库函数间接使用内核接口,也可以直接通过系统调用进入内原创 2017-09-15 18:59:55 · 275 阅读 · 0 评论 -
3、不带缓冲的文件IO
1、不带缓冲指非ISO C库函数,如read、write函数(内核处有缓冲),比C库函数的文件读写少一层应用层的缓冲2、UNIX系统shell把文件描述符0、1、2关联进程的标准输入、输出、错误,定义为符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO(定义在unistd.h)3、open//创建并打开//最后一个参数可以没有,mode指定访问权限;oflag原创 2017-09-18 21:09:54 · 413 阅读 · 0 评论 -
4、 文件和目录
1、stat返回与文件相关的结构信息#include <sys/stat.h>//restrict 告诉编译器,对象被指针引用,不允许通过其他方式修改int stat(const char *restrict pathname, struct stat *restrict buf);int fstat(int fd, struct stat *restrict buf);//lstat类似sta原创 2017-09-19 14:35:00 · 303 阅读 · 0 评论 -
5、标准I/O库
1、标准IO库由ISO C说明,不仅UNIX,其他很多操作系统都实现。前面的非缓冲IO,打开一个文件即返回一个文件描述符。标准IO库打开或创建一个文件时,就使一个流和一个文件相关联。2、流的定向:国际字符集的一个字符可用多个字节表示,流的定向就是决定所读、写的字符是单字节还是多字节。#include <wchar.h>//该函数不改变已定向的流//当还没定向时,mode>0,使流是宽定向;mod原创 2017-09-22 16:22:37 · 288 阅读 · 0 评论 -
7、进程环境
1、退出函数//_exit,_Exit直接进入内核,exit先执行一些清理操作,再进入内核//ISO C#include <stdlib.h>void exit(int status);//exit(0)等于return(0)void _Exit(int status);//POSIX#include <unistd.h>void _exit(int status);2、终止处理登记//原创 2017-09-28 09:20:57 · 146 阅读 · 0 评论 -
二级指针传参和函数指针
根据《C语言深度解析》二级指针void GetMemory(char** p,intnum){ *p = (char*)malloc(num*sizeof(char)); returnp;}int main(){ char*str= NULL; GetMemory(&str,10); strcpy(str,”hello”); fr转载 2017-11-07 22:35:12 · 793 阅读 · 0 评论 -
7、进程环境
1、退出函数//_exit,_Exit直接进入内核,exit先执行一些清理操作,再进入内核//ISO C#include <stdlib.h>void exit(int status);//exit(0)等于return(0)void _Exit(int status);//POSIX#include <unistd.h>void _exit(int status);2、终止处理登记//原创 2017-11-07 22:47:21 · 115 阅读 · 0 评论 -
21、网络IPC:套接字(2)
1、数据传输//发送数据,成功返回发送的字节数//发送成功只能表示数据已经无错误的发送到网络驱动程序上ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);//sendto可以为无连接的套接字指定一个目标地址//面向连接的套接字连接中隐含目标地址ssize_t sendto(int sockfd, const原创 2017-10-26 20:39:07 · 136 阅读 · 0 评论