Linux学习随笔(1)

1.文件I/O(操作描述符,open, create, write, read, lseek)一般称为不带缓冲的I/O,即每个人read、write函数都调用内核中的一个系统调用。
标准I/O(操作流),需要处理缓冲,为了减少read和write等的调用次数,标准I/O打开或创建一个文件时,文件已经与一个流相关联。流的定向决定了读写字符的是单字节还是多字节(fwide修改),FILE对象指针,包含I/O库为管理流所需信息,包括:用于实际I/O的文件描述符,缓冲区指针,缓冲区长度,当前缓冲区字符数和出错标志等。
标准I/O:getc, fgetc, getchar, putc, fputc, putchar, gets, fgets, puts, fputs, fread, fwrite

fileno(FILE *fp)将流转化为文件描述符

2.Linux  I/O数据结构:进程在进程表中有一个记录项,记录打开的文件描述符表,每项包含描述符标识以及指向文件表的指针;内核为所有打开文件维持一张文件表,每项包含文件状态标识,当前文件偏移量,指向文件V节点的指;每个打开文件节点都有一个V节点结构,包含了文件类型以及对此文件进行操作的各种函数指针,还包含了i节点(索引节点),其包含文件的所有者、文件长度、所在设备、指向文件在硬盘实际位置的指针等。

3.fork之后,父子进程共享的是文件表项

4.进程相关用户ID和组ID:
实际用户(组)ID: 标识当前用户是谁;
有效用户(组)ID: 决定文件访问权限;
保存的设置用户(组)ID: 执行文件时,将进程的有效用户ID设置为文件所有者的用户ID。

5.粘住位(保存正文位save text bit):程序第一次执行结束之后,正文部分的一个副本仍然保存在交换区,下次执行的时候,程序能够很快的装入内存。因为交换区占用连续磁盘空间,程序正文也是连续存放,相对于随机存放的文件,能够提高速度。
需目录有写权限的用户想删除或更改目录下的文件:拥有此文件,拥有此目录,超级用户。
目录/tmp /var/spool/uncppublic的权限一般是0777,任一用户都可以创建文件,但不能删除他人文件,因此设置了粘住为。

6. lsof 列出当前系统打开的文件。lsof filename 列出打开文件filename的所有进程。
lsof -i [46] [protocol] [@hostname | hostaddr] [:service | port]
46- IPv4 IPv6
protocol - TCP/UDP
hostname - Internet hostname
hostaddr - IPv4 address
service - service name,可以不止一个
port - 可以不止一个

7. 回复误删除的文件
http://blog.csdn.net/guoguo1980/article/details/2324454

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。

当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:

首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

# lsof |grep /var/log/messages
syslogd  1283      root    2w      REG        3,3  5381017    1773647 /var/log/messages (deleted)

从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

# head -n 10 /proc/1283/fd/2
Aug  4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug  4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug  4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug  4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)

从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:

cat /proc/1283/fd/2 > /var/log/messages

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

8. 将标准输出与标准错误都才重定向到同一个文件:
    ls -l >list.txt 2>&1 或者 ls -l &>list

9. 管道命令仅仅处理stdout,并不处理stderr。

10. quato是针对整个文件系统,并不针对目录。

11. Linux系统负载为:特定时间间隔内运行队列中平均进程数。

12.优先级继承
由于互斥,一个进程(设为A)可能因为等待进入临界区而睡眠。直到正在占有相应资源的进程(设为B)退出临界区,进程A才被唤醒。
可能存在这样的情况:A的优先级非常高,B的优先级非常低。B进入了临界区,但是却被其他优先级较高的进程(设为C)抢占了,而得不到运行,也就无法退出临界区。于是A也就无法被唤醒。
A有着很高的优先级,但是现在却沦落到跟B一起,被优先级并不太高的C抢占,导致执行被推迟。这种现象就叫做优先级反转。

出现这种现象是很不合理的。较好的应对措施是:当A开始等待B退出临界区时,B临时得到A的优先级(还是假设A的优先级高于B),以便顺利完成处理过程,退出临界区。之后B的优先级恢复。这就是优先级继承的方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值