![](https://img-blog.csdnimg.cn/20201021224920384.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Unix/Linux Programming
文章平均质量分 81
Understanding Unix/Linux Programming
Revendell
分布式数据库内核开发
展开
-
23 IPC
1、select系统调用select():同步的IO复用,int result=select(int numfds,fd_set *read_set,fd_set *write_set,fd_set *error_set,struct timeval *timeout),numfds是需要监听的最大fd值加1,read_set是等待从此集合包括的文件描述符到来的数据,write_set是等待向这些文件描述符写数据的许可,error_set是等待这些文件描述符操作的异常,timeout是超时此时间后函数返原创 2020-10-19 01:08:27 · 111 阅读 · 0 评论 -
22 pthread应用
1、多线程的web服务器如果程序员忘记使用pthread_join来收回线程,这些线程所占用的资源就无法被收回,类似于用malloc来分配的空间却没有用free释放掉一样。这里可以创建不需要返回的线程,称之为独立线程(detached threads)。当函数执行完毕之后,独立线程自动释放它所占用的所有的资源,它们自身也不允许等待其他的线程返回。通过传递一个特殊的属性参数给函数pthread_create来创建一个独立线程:pthread_t t; pthread_attr_t attr_deta原创 2020-10-12 00:09:17 · 131 阅读 · 0 评论 -
21 pthread——pthread_create、pthread_join、互斥量、条件量
1、线程涉及的系统调用pthread_create():创建一个新的线程,int pthread_create(pthread_t *thread,pthread_attr_t *attr,void func,void *arg),thread指向pthread_t类型变量的指针,attr指向pthread_attr_t类型变量的指针或者为NULL,func为新进程所运行的函数,arg为传递给func的参数,返回0成功否则失败。pthread_create函数创建一条新的执行路线,在此新的路程内调用了f原创 2020-10-11 22:23:50 · 497 阅读 · 0 评论 -
20 licenseserv——数据报socket的应用
1、许可证服务器版本1.0运行服务器和客户端,首先客户端进入get_ticket函数:client将HELO pid发给server,server再传回消息,如果传回来TICK %d.%d,将%d. %d保存至ticket_buf,获得ticket槽位,如果传回来FAIL,获取ticket失败。然后客户端进入do_regular_work函数。最后客户端进入release_ticket函数:client睡眠10秒后,发送GBYE %d. %d给server,server再传回消息,如果传回来THNX,s原创 2020-09-29 01:43:15 · 183 阅读 · 0 评论 -
19 datagram
1、数据报socket和流socket的不同socket有两种不同的选择,一种是基于流的socketTCP,它是用来连接不相关的进程的,另一种被称为数据报socketUDP。流socket传送数据就跟电话网中传送声音一样,客户先建立连接,然后使用该连接进行单向、双向或类似管道的字节流传送。数据报通信则与从一个邮箱到另一个邮箱发送包裹类似,客户不必建立连接,只要向特定的地址发送消息,而服务器进程在该地址接收消息。流socket使用的网络协议叫TCP即传输控制协议(Transmission Control原创 2020-09-29 00:51:56 · 119 阅读 · 0 评论 -
18 webserv——流socket的应用
1、服务器设计学习了网络编程的基本操作和设计原则,建立一个Web服务器,这是一个典型的socket流的客户端/服务器系统。服务器设立服务,然后进入循环接收和处理请求。客户端连接到服务器,然后发送、接收或者交换数据,最后退出。该交互过程主要包含3个操作:服务器设立服务 客户连接到服务器 服务器和客户处理事务2、建立服务器socket设立一个服务一般需要3个步骤:创建一个socket:socket=socket(PF_INET,SOCK_STREAM,0) 给socket绑定一个地址:b原创 2020-09-24 00:19:13 · 132 阅读 · 0 评论 -
17 socket——socket、bind、listen、accept、connect
1、socket——与远端进程相连管道的不足:管道使得进程向其他进程发送数据就像向文件发送数据一样容易,但是管道具有两个重大的缺陷。管道在一个进程中被创建,通过fork来实现共享,因此管道只能连接相关的进程,也只能连接同一台主机上的进程。Unix提供了另外一种进程间的通信机制socket,socket允许在不相关的进程间创建类似管道的连接,设置可以通过socket连接其他主机上的进程。2、socket客户端/服务器工作原理(1)socket服务器工作流程——socket、bind、liste原创 2020-09-22 21:05:14 · 630 阅读 · 0 评论 -
16 fdopen、popen
1、不同数据源Unix提供一个接口来处理可能来自不同数据源的数据,总共包括4种类型的数据源,分别是磁盘文件、设备、管道、sockets。磁盘/设备文件用open命令连接,用read和write传递数据;管道用pipe命令创建,用fork分享,用read和write传递数据;sockets用socket、listen和connect连接,用read和write传递数据。2、bc(1)bc的思想(2)bc的实现3、fdopen4、popen5、访问数据的历史演变...原创 2020-09-21 21:56:02 · 272 阅读 · 0 评论 -
15 管道——pipe
1、创建管道使用管道可以用来连接一个进程的输出和另一个进程的输入,管道是内核中的一个单向的数据通道,管道有一个读取端和一个写入端。pipe系统调用:pipe():创建管道,result=pipe(int array[2]),调用pipe来创建管道并将两端连接到两个文件描述符,array[1]为写数据端的文件描述符,array[0]为读数据端的文件描述符,管道的内部实现隐藏在内核中,进程只能看见两个文件描述符。pipe调用也使用最低可用文件描述符。2、创建管道并向自己发送数据首先进程通过标准原创 2020-09-10 22:54:20 · 450 阅读 · 0 评论 -
14 IO重定向——dup、dup2
1、原创 2020-09-10 21:47:28 · 297 阅读 · 0 评论 -
13 smsh——编写自己的shell
1、什么是shell脚本语言Unix的引导程序和很多管理程序都使用shell脚本,shell是一个变成语言解释器,这个解释器解释从键盘输入的命令,也解释存储在脚本中的命令序列。shell脚本是一个包含一系列命令的文件。运行一个脚本就是运行这个文件中的每个命令。可以用一个shell脚本在一次请求中来执行多个命令。shell脚本中元素:命令、变量、用户输入、控制、环境。2、smsh1.c对自编shell的第一个改进是添加命令行解析的功能。比如:find /home -name core -mti原创 2020-09-09 00:03:09 · 1167 阅读 · 0 评论 -
12 psh——execvp、fork、wait、_exit
1、ps能做什么(1)什么是进程进程=运行中的程序,一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式,运行一个程序意味着将这个机器指令序列载入内存然后让处理器逐条执行这些指令。一个可执行程序是一个机器指令及其数据的序列,一个进程是程序运行时的内存空间和设置。(2)ps能做什么进程存在于用户空间,用户空间是存放运行的程序和它们的数据的一部分内存空间。命令ps(process status)可以查看用户空间的内容,显示当前用户空间所有的进程,总共是四列内容,分别是进原创 2020-09-07 00:59:11 · 681 阅读 · 0 评论 -
11 视频游戏:阻塞信号、输入信号异步IO——sigprocmask、kill
1、临界区一段修改一个数据结构的代码如果运行时被打断将导致数据的不完整或损毁,则称这段代码为临界区。当程序处理信号时,必须决定哪一段代码为临界区,然后设法保护这段代码。保护临界区的最简单的办法就是阻塞或忽略那些处理函数将要使用或修改特定数据的信号。2、...原创 2020-09-05 15:37:34 · 180 阅读 · 0 评论 -
10 信号处理——signal、sigaction
1、signal各种事件促使内核向进程发送信号,包括用户的击键、进程的非法操作和计时器到时,一个进程调用signal在一下3种处理信号的方法之中选择:默认操作(一般是终止进程),如signal(SIGALRM,SIG_DEL) 忽略信号,如signal(SIGALRM,SIG_IGN) 调用一个函数,如signal(SIGALRM,handler)signal的缺陷:signal处理根据不同版本不同选择不可靠的信号:如果两个SIGINTS信号杀死了进程,意味着你的系统是不可靠信号,处理函数原创 2020-09-05 00:06:41 · 970 阅读 · 0 评论 -
09 时钟编程——alarm、pause、getitimer、setitimer
1、Alarms时钟可以用来调度一个将来要做的任务,Unix提供alarm。使用sleep函数添加时延,sleep(n)将当前进程挂起n秒或者在此期间被一个不能忽略的信号到达所唤醒。sleep()的工作原理:系统的每个进程都有一个私有的闹钟(alarm clock),这个闹钟很像一个计时器,可以设置一定秒数后闹铃。时间一到,时钟就发送一个信号SIGALRM到进程。除非进程为SIGALRM设置了处理函数,否则信号将杀死这个进程。这就是sleep的原理,sleep函数由3个步骤组成:为SIGAL原创 2020-09-03 21:41:29 · 409 阅读 · 0 评论 -
08 屏幕编程curses库
1、屏幕编程curses库curses库是一组函数,是用来设置光标位置和终端屏幕上显示的字符样式。curses将屏幕看成二维网格,原点是屏幕左上角,行坐标自上往下递增,列坐标自左向右递增。基本的curses函数:initscr():初始化curses库和tty endwin():关闭curses并重置tty refresh():使屏幕按照你的意图显示 move(x,y):移动光标到屏幕(x,y)位置 addstr(s):在当前位置画字符串s addch(c):在当前位置画字符c clea原创 2020-09-03 20:54:25 · 323 阅读 · 0 评论 -
07 signal——signal
1、signal能做什么(1)Ctrl-C做了什么?Ctrl-C中断当前运行的程序,这个中断由一个称为信号的内核机制产出。当按Ctrl-C时,内核向当前正在运行的进程发送中断信号,每个中断信号都有一个数字编码。呢?用户输入Ctrl-C 驱动程序收到字符 匹配VINTR和ISIG的字符被开启 驱动程序调用信号系统 信号系统发送SIGINT到进程 进程收到SIGINT并消亡(2)信号从哪里来?信号来自内核,生成信号的请求来自3个地方。用户:用户能够通过Ctrl-C、Ctrl-\或原创 2020-08-30 14:48:39 · 210 阅读 · 0 评论 -
06 stty——fcntl、tcgetattr、tcsetattr
1、stty能做什么stty命令让用户读取和修改终端驱动程序的设置,既可以使用stty显示驱动程序设置,比如:stty,也可以使用stty改变驱动程序设置,比如:stty -echo关闭按键回显,stty echo打开按键回显。2、stty是如何实现的(1)设备就像文件每个设备都被当做一个文件,每个设备都有一个文件名、一个i-节点号、一个文件所有者、一个权限位的集合和最近修改时间,表示设备的文件存放在目录/dev中,设备不仅具有文件名,而且支持与所有文件相关的系统调用:open、read、w原创 2020-08-28 01:22:40 · 1151 阅读 · 0 评论 -
05 pwd——mkdir、rmdir、unlink、rename、chdir
1、pwd能做什么命令pwd用来显示到达当前目录的路径。2、pwd是如何实现的(1)创建一个文件的过程文件有内容和属性,内核将文件内容存放在数据区,文件属性存放在i-节点,文件名存放在目录。创建一个文件的4个主要操作:存储属性:内核先找到一个空的i-节点,内核将文件的属性信息记录其中。 存储数据:内核从自由块的列表中找出相应文件大小个数的自由块。内核缓冲区的数据一块一块复制到自由块。 记录分配情况:内核在i-节点的磁盘分布区记录了上述的块序列,磁盘分布区是一个磁盘块序号列表。 添加原创 2020-08-27 00:08:04 · 232 阅读 · 0 评论 -
04 ls——stat、chmod、chown、utime
1、ls能做什么ls的默认动作是找到当前目录中所有文件的文件名,按字典序排序后输出,ls -l会列出每个文件的详细信息。所以ls做了一下两件事,第一列出目录的内容,第二显示文件的信息。自己编写一个ls,一下三点需要掌握:如何列出目录内容 如何读取并显示文件属性 给一个名字,如何能够判断出它是目录还是文件2、ls是如何实现的ls的逻辑和who十分相似,主要区别是who从文件中读数据,而ls从目录中读数据。ls的工作流程:打开目录,读取每个条目,展示文件的信息,关闭目录。目录是文件的列原创 2020-08-24 23:04:10 · 193 阅读 · 0 评论 -
内核缓冲技术
1、缓冲区的大小对性能的影响缓冲区的大小对性能有很大的影响,对文件操作而言,来看一个2500字节的文件的copy操作,如果缓冲区大小=100字节,那么需要25次read和25次write,如果缓冲区大小=1000字节,那么需要3次read和3次write,把缓冲区从100字节增加到1000字节会使系统调用次数从50次减少到6次。read和write这些系统调用是需要时间的,程序中频繁的系统调用会降低程序的运行效率。2、为什么系统调用需要很多时间用户进程位于用户空间,内核位于系统空间,磁盘只能被内原创 2020-08-20 00:57:48 · 350 阅读 · 0 评论 -
03 cp——creat、write、lseek
1、cp能做什么cp能够复制文件,cp sourcefile targetfile,如果targetfile不存在,cp就会创建这个文件,如果已经存在就覆盖,targetfile的内容与sourcefile相同。2、cp是如何实现的cp命令主要涉及creat和write这两个系统调用。cp流程:打开sourcefile为了读取内容,打开targetfile为了写入内容,从sourcefile中读取内容到buffer缓冲区,将buffer缓冲区中内容写入到targetfile,最后关闭source原创 2020-08-19 22:41:42 · 291 阅读 · 0 评论 -
02 who——open、read、close
1、who能做什么who命令可以显示出当前系统中已经登录的用户信息,输入who命令,就可以知道有谁正在使用系统。who命令每一行代表一个已经登录的用户,第1列是用户名,第2列是终端名,第3列是登录时间,第4列是用户的登录地址。2、who是如何实现的在联机帮助中描述了who的功能和用法,所以通过联机帮助可以学习who任何实现与工作的。阅读联机帮助:man who,在描述部分写了已登录用户的信息是放在/var/adm/utmp文件中,who就是通过读该文件获得信息。 搜索联机帮助:man原创 2020-08-19 00:10:32 · 865 阅读 · 0 评论 -
01 more
1、more能做什么more可以分页显示文件的内容,more会显示文件的第一屏的内容,在屏幕的底部,more用反白字体显示文件的百分比,如果按空格键,文件的下一屏内容会出现,如果按回车键,显示的则是下一行,如果输入q,结束显示,如果输入h显示出来的是more的联机帮助。more有3中用法:more filename:more显示文件filename的内容 command | more:more将command命令的输出分页显示 more < filename:more从标准输入获取要.原创 2020-08-17 23:40:32 · 106 阅读 · 0 评论