在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。

Linux句柄
Linux中所有的事物或资源都是以文件的形式存在,比如消息、共享内存、连接等,句柄可以理解为指向这些文件的指针。
对于这些句柄,Linux是有数量限制的,单个进程默认可以打开的句柄数上限,可以用以下命令来查看:
查看某个进程的句柄数上限,命令是:
单个进程句柄数的修改(系统重启后会恢复默认值)
$-n句柄数
永久修改单个进程句柄数
$cat>>/etc/secURIty/limits.conf
说明:修改完成后,需要重新打开终端,使用 ulimit -a 查看句柄数
查询系统中指定进程占用的句柄数
$lsof-n|grep[PID|进程名]|wc-l
查询系系统中进程占用的句柄数
$lsof-n|awk|sort|uniq-c|sort-nr|more
文件类型有以下几种: DIR:表示目录。 CHR:表示字符类型。 BLK:块设备类型。 UNIX: UNIX 域套接字。 FIFO:先进先出 (FIFO) 队列。 IPv4:网际协议 (IP) 套接字。
LINUX对能够打开的文件句柄的数量做了限制。限制是分为三个层面:系统层面,用户层面和进程层面。 如果某个进程打开的文件句柄超过限制,再打开文件就会报错。因此,在编程时,如果进程要占用大量文件句柄的话, 就要看看是否要调整最大可打开的文件句柄数,同时也要注意cLose释放掉不用的文件句柄。
系统层面
$cat/proc/sys/fs/file-max
用户层面
进程层面
$cat/proc/PID/limits
关于linux编程中fork和pipe的问题
fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括: —全局和局部变量 —打开的文件句柄 —共享内存、消息等同步对象由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么: —父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了 —反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,SOCket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。 在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。
linux中如何提取文件中特定的行?
cat file1 file2 |sort|uniq -c |grep -v 2 |cut -d -f 2-如果你的文件每行都是维一的可以这样处理. grep -v 后面的 2 可以按着你的实际情况前面多加几个空格.
linux中at命令
linux at 命令详解使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME说明 : at 可以让使用者指定在 TIME 这个特定时刻执行某个程序或指令,TIME 的格式是 HH:MM其中的 HH 为小时,MM 为分钟,甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点锺)等口语词。 如果想要指定超过一天内的时间,则可以用 MMDDYY 或者 MM/DD/YY 的格式,其中 MM 是分钟,DD 是第几日,YY 是指年份。 另外,使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间,其中的时间间隔可以是 minutes, hours, days, weeks。 另外,使用者也可指定 today 或 tomorrow 来表示今天或明天。 当指定了时间并按下 enter 之后,at 会进入交谈模式并要求输入指令或程序,当你输入完后按下 ctrl+D 即可完成所有动作,至于执行的结果将会寄回你的帐号中。 参数 :-V : 印出版本编号-q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个-m : 即使程序/指令执行完成后没有输出结果, 也要寄封信给使用者-f file : 读入预先写好的命令档。 使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d)-v : 列出所有已经完成但尚未删除的指定
发表评论