网络IPC:套接字之带外数据

带外数据(Out-of-banddata)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输。即使传输队列已经有数据,带外数据先行传输。TCP支持带外数据,但是UDP不支持。套接字接口对带外数据的支持,很大程度受TCP带外数据具体实现的影响。TCP将带外数据称为“紧急”数据(“urgent”data)。TCP仅支持一个字节的紧急数据,但是允许紧急数据在普通数据传递机制数据流之外传输。为了产生紧急数据,在三个send函数中任何一个指定标志MSG_OOB。如果带MSG_OOB标志传输字节超过一个时,最后一个字节被看作紧急数据字节。如果安排发生套接字信号,当接收到紧急数据时,那么发送信号SIGURG。在http://www.cnblogs.com/nufangrensheng/p/3500350.html和http://www.cnblogs.com/nufangrensheng/p/3558505.html中BSD异步I/O部分,可以看到在fcntl中使用F_SETOWN命令来设置一个套接字的所有权。如果fcntl中第三个参数为正值,那么指定了进程ID;如果为非-1的负...

网络IPC套接字数据传输

既然将套接字端点表示为文件描述符,那么只要建立连接,就可以使用read和write来通过套接字通信。通过在connect函数里设置对方地址,数据套接字也可以“连接”。在套接字描述符上采用read和write是非常有意义的,因为可以传递套接字描述符到那些原先设计为处理本地文件的函数。而且可以安排传递套接字描述符到执行程序的子进程,该子进程并不了解套接字。尽管可以通过read和write交换数据,但这就是这两个函数所能做的一切。如果想指定选项、从多个客户端接收数据包或者发送带外数据,需要采用6个传递数据套接字函数中的一个。三个函数用来发送数据,三个用来接收数据。首先,考察用于发送数据的函数。最简单的是send,它和write很像,但是可以指定标志来改变处理传输数据的方式。#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tnbytes,intflags);返回值:若成功则返回发送的字节数,若出错则返回-1类似write,使用send时套接字必须已经连接。参数buf和nbytes与write中的含义一...

线程控制之线程私有数据

线程私有数据(也称线程特定数据)是存储和查询与某个线程相关的数据的一种机制。把这种数据称为线程私有数据或线程特定数据的原因是:希望每个线程可以独立地访问数据副本,而不需要担心与其他线程的同步访问问题。线程模型促进了进程中数据和属性的共享,许多人在设计线程模型时会遇到各种麻烦。但在这样的模型中,为什么还需要提出一些合适的用于阻止共享的接口呢?其中有两个原因:第一,有时候需要维护基于每个线程的数据。采用线程私有数据的第二个原因是:它提供了让基于进程的接口适应多线程环境的机制。一个很明显的实例就是errno。回忆http://www.cnblogs.com/nufangrensheng/p/3495426.html中对errno的讨论,(线程出现)以前的接口把errno定义为进程环境中全局可访问的整数。系统调用和库例程在调用或执行失败时设置errno,把它作为操作失败时的附属结果。为了让线程也能够使用那些原本基于进程的的系统调用和库例程,errno被重新定义为线程私有数据。这样,一个线程做了设置errno的操作并不会影响进程中其他线程的errno的值。进程中的所有线程都可以访问进程的整个地址...
代码星球 代码星球·2021-02-21

系统数据文件和信息之时间和日期例程

由UNIX内核提供的基本时间服务是计算自国际标准时间公元1970年1月1日00:00:00以来经过的秒数。这种秒数是以数据类型time_t表示的。我们称它们为日历时间。日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:(a)以国际标准时间而非本地时间计时;(b)可自动进行转换,例如变换到夏时制;(c)将时间和日期作为一个量值保存。time函数返回当前时间和日期:#include<time.h>time_ttime(time_t*calptr);返回值:若成功则返回时间值,若出错则返回-1时间值总是作为函数值返回。如果参数不为空,则时间值也存放在由calptr指向的单元内。在系统V派生的系统中,调用stime(2)函数,在BSD派生的系统中,则调用settimeofday(2),用于对内核中的当前时间设置初始值。与time函数相比,gettiimeofday提供了更高的分辨率(最高为微秒级)。这对于某些应用很重要。#include<sys/time.h>intgettimeofday(structtimeval*restricttp,void*res...

系统数据文件信息系统标识

POSIX.1定义了uname函数,它返回与当前主机和操作系统有关的信息。#include<sys/utsname.h>intuname(structutsname*name);返回值:若成功则返回非负值,若出错则返回-1通过该函数的参数向其传递一个utsname结构的地址,然后该函数填写此结构。POSIX.1只定义了该结构中至少需要提供的字段(它们都是字符数组),而每个数组的长度则由实现确定。某些实现在该结构中提供了另外一些字段。structutsname{charsysname[];/*nameoftheoperatingsystem*/charnodename[];/*nameofthisnode*/charrelease[];/*currentreleaseofoperatingsystem*/charversion[];/*currentversionofthisrelease*/charmachine[];/*nameofhardwaretype*/};每个字符串都以null字符结尾。utsname结构中的信息通常可以用uname(1)命令打印。历史上,BSD派...

系统数据文件信息之登录账户记录

大多数UNIX系统都提供下列两个数据文件:utmp文件,它记录当前登录进系统的各个用户;wtmp文件,它跟踪各个登录和注销事件。在V7中,每次写入这两个文件中的是包含下列结构的一条二进制记录:structutmp{charut_line[8];/*ttyline:"ttyh0","ttyd0","ttyp0",...*/charut_name[8];/*loginname*/longut_time;/*secondssinceEpoch*/};登录时,login程序填写此类型结构,然后将其写入到utmp文件中,同时也将其添写到wtmp文件中。注销时,init进程将utmp文件中相应的记录擦除(每个字节都填以0),并将一个新记录添写到wtmp文件中。在wtmp文件的注销记录中,将ut_name字段清0。在系统重新启动时,以及更改系统时间和日期的前后,都在wtmp文件中添写特殊的记录项。who(1)程序读utmp文件,并以可读格式打印其内容。后来的UNIX版本提供了last(1)命令,它读wtmp文件并打印所选择的记录。在Linux2.4.22中,这两个文件的路径名是/var/run/ut...

系统数据文件信息之其他数据文件

在日常操作中,UNIX系统还使用很多其他文件。例如,BSD网络软件有一个记录各网络服务器所提供服务的数据文件(/etc/services),有一个记录协议信息数据文件(/etc/protocols),还有一个则是记录网络信息数据文件(/etc/networks)。一般情况下,对于每个数据文件至少有三个函数:(1)get函数:读下一个记录,如果需要,还可以打开该文件。这些函数通常返回指向一个结构的指针。当已到达文件尾端时则返回空指针。大多数get函数返回指向一个静态结构的指针,如果要保存其内容,则需要复制它。(2)set函数:打开相应数据文件(如果尚未打开),然后反绕(rewinds to the beginning)该文件。如果希望在相应文件起始处开始处理,则调用此函数。(3)end函数:关闭相应数据文件。在结束了对相应数据文件的读、写操作后,总应调用此函数以关闭所有相关文件。另外,如果数据文件支持某种形式的关键字搜索,则会提供搜索具有指定关键字记录的例程。例如,对于口令文件,提供了两个按关键字进行搜索的程序:getpwnam寻找具有指定用户名的记录;...

系统数据文件信息之附加组ID

4.2BSD引入了附加组ID(supplementarygroupID)的概念。我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组。文件访问权限检查相应被修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附加组ID与文件的组ID进行比较。常量NGROUPS_MAX规定了附加组ID的数量,其常用值是16.使用附加组ID的优点是不必再显式地经常更改组。一个用户会参加多个项目,因此也就要同时属于多个组。为了获取和设置附加组ID,提供了下列三个函数:#include<unistd.h>intgetgroups(intgidsetsize,gid_tgrouplist[]);返回值:若成功则返回附加组ID数,若出错则返回-1#include<grp.h>/*onLinux*/#include<unistd.h>/*onFreeBSD,MacOSX,andSolaris*/intsetgroups(intngroups,constgid_tgrouplist[]);#include<grp.h>/*onLinu...

系统数据文件信息之组文件

UNIX组文件(POSIX.1称其为组数据库)包含了表6-3中所示的字段。这些字段包含在<grp.h>中所定义的group结构中。                                                            表6-3/etc/group文件中的字段字段gr_mem是一个指针数组,其中每个指针各指向一个属于该组的用户名。该数组以空指针结尾。可以用...

系统数据文件信息之阴影口令

加密口令是经单向加密算法处理过的用户口令副本。因为此算法是单向的,所以不能从加密口令猜测到原来的口令。历史上使用的算法总是从64字符集中产生13个可打印字符。某些较新的系统使用MD5算法对口令加密,为每个加密口令产生31个字符。给出一个加密口令,找不到一种算法可以将其逆转到普通文本口令(普通文本口令是在Password:提示符后键入的口令)。但是可以对口令进行猜测,将猜测的口令经单向算法变换成加密形式,然后将其与用户的加密口令相比较。为使企图这样做的人难以获得原始资料(加密口令),现在,某些系统将加密口令存放在另一个通常称为阴影口令(shadowpassword)的文件中。该文件至少要包含用户名和加密口令。与该口令相关的其他信息也可存放在该文件中(表6-2)。只有用户登录名和加密口令这两个字段是必需的。其他字段用于控制口令的改动频率(称为口令的衰老)以及账户保持活动状态的时间。阴影口令文件不应是一般用户可以读取的。仅有少数几个程序需要存取加密口令,例如login(1)和passwd(1),这些程序常常是设置用户ID为root的程序。有了阴影口令后,普通口令文件/etc/passwd可由...

系统数据文件信息之口令文件

UNIX系统的口令文件(POSIX.1则将其称为用户数据库)包含了表6-1中所示的各字段,这些字段包含在<pwd.h>中定义的passwd结构中。注意,POSIX.1只指定了passwd结构包含的10个字段中的5个。大多数平台至少支持其中7个字段。                                                       表6-1/etc/passwd文件中的字段由于历史原因,口令文件存储在/etc/...

UNIX标准化及实现之基本系统数据类型

历史上,某些UNIX系统变量已与某些C数据类型联系在一起。例如,历史上主、次设备号一直存放在一个16位的短整型中,8位表示主设备号,另外8位表示次设备号。但是,很多较大的系统需要用多于256个值来表示其设备号,于是,就需要有一种不同的技术。头文件<sys/types.h>中定义了某些与实现有关的数据类型,它们被称为基本系统数据类型(primitivesystemdatatype)。还有很多这种数据类型定义在其他头文件中。在头文件中,这些数据类型都是用C的typedef功能来定义的。它们绝大多数都以_t结尾。表1某些常用的基本系统数据类型类型说明caddr_t核心地址clock_t时钟滴答计数器(进程时间)comp_t压缩的时钟滴答dev_t设备号(主和次)fd_set文件描述符集fpos_t文件位置gid_t数值组IDino_ti节点编号mode_t文件类型,文件创建模式nlink_t目录项的链接计数off_t文件大小和偏移量(带符号的)pid_t进程ID和进程组ID(带符号的)ptrdiff_t两个指针相减的结果(带符号的)rlim_t资源限制sig_atomic_t能原...

数据备份基础之备份类型

数据备份的方式有完全备份、差异备份以及增量备份,那么这三种备份方式有什么区别,在具体应用中又该如何选择呢?本文就这些问题作以介绍。一、备份方式简介1、完全备份(FullBackup)备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件。在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份。换言之,清除存档属性。完全备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。实际应用中就是用一盘磁带对整个系统进行完全备份,包括其中的系统和所有数据。这种备份方式最大的好处就是只要用一盘磁带,就可以恢复丢失的数据。因此大大加快了系统或数据的恢复时间。然而它的不足之处在于,各个全备份磁带中的备份数据存在大量的重复信息;另外,由于每次需要备份的数据量相当大,因此备份所需时间较长。2、差异备份(DifferentialBackup)备份自上一次完全备份之后有变化的数据。差异备份过程中,只备份有标记的那些选中的文件和文件夹。它不清除标记,也即备份后不标记为已备份文件。换言之,不清除存档属性。差异备份是指在一次全备份后到进行差异备份的这段时间内,对那些增加或者修改文件的备份。在进...

数据连接命令join

join主要用来将两个相关联的文件连接起来。两个文件相关联的意思是指这两个文件中有一些字段是关联的,例如两个文件的第1个字段都是学号,且每个学生的学号是唯一的。像这种具有唯一性关联的文件,就可以使用join命令连接。命令格式:join[option]file1file2常用选项:a:用于输出两个文件中有关联的和没有关联的行,将有关联的行执行连接后输出,没有关联的行按预定的格式输出。e:在文件1和文件2中查找关联字段,如果没有关联字段,则将无关联的行相应的字段用参数指定的字符串替代。i:在连接过程中忽略大小写。j:使用指定的字段作为关联字段连接。o:格式化输出。t:设置字段间的分隔符,默认为空格或制表符Tab。v:与选项a的作用相同,但选项v只输出无关联的行。使用join命令时,join用数字1来表示参数文件1,用数字2表示参数文件2.用法示例:(1)默认情况下join会使用参数文件的第1个字段作为关联字段。例如:[root@localhosttest]#catjoin1001Tom002Jim003Kate004Marry005Lucy[root@localhosttest]#catj...
代码星球 代码星球·2021-02-21

数据剪切命令cut和数据粘贴命令pastte

在Windows中,经常从一个文件将一段文本移动到另一个文件中。在Linux中执行这个任务的是cut和paste命令。一、数据剪切命令cut命令格式:cut[option][file]常用选项:b:表示要操作的对象是字节。c:表示要操作的对象是字符。f:表示要操作的对象是字段。d:指定字段分隔符,默认情况下是制表符Tab。s:表示不包含没有字段分隔符的行,这个选项通常用于去掉注释等。剪切范围表示方法如下:N:表示第N个字节、字符或字段。N-:表示从N到一行结束内的所有文本。N-M:表示从N到M之间的所有文本。-M:表示从开始到M之间的所有文本。-:从开始到结束的所有文本。除了上面的表示范围的方法以外,还可以像前面匹配行时一样,使用诸如“N,M”之类的表示方法。用法示例:使用cut剪切时,剪切的文本可以来自文件,也可以来自管道、其他命令的输出等。完成剪切后,cut与大多数文本操作命令一样,不会操作原有文件(即不改变原有文本的内容),而是直接将结果输出到标准输出。cut命令工作时,以行为单位剪切整个文本(即同样的剪切命令会对文本的每一行都生效)。(1)对已经计算好字节数或具备特殊格式的文本...
首页上一页...382383384385386...下一页尾页