几个永远不要运行的危险Linux命令!
文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统。所以不在root等高级管理权限下执行命令是很好的习惯。
文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统。所以不在root等高级管理权限下执行命令是很好的习惯。
当今最热门的桌面Linux非Ubuntu莫属,它已经拥有数量众多的爱好者,已经成为PC用户的主流操作系统之一。尽管Ubuntu相对还比较年轻,但是它的前身却是拥有多年历史和经验的Debian项目,或者说它继承了Debian这个最古老、最具影响力的Linux发行版的优点。这两个最受欢迎的Linux发行版之间存在着密不可分的“血缘”关系。
来源:赛迪网 作者:xiaoxin
SSH是一个Linux系统自带的远程互访的服务,双机的安装需要SSH的支持,并且需要配置使两台服务器之间可以直接互访而无需密码。因此安装双机前需要首先配置SSH,否则无法安装双机软件。
请按以下步骤设置SSH密钥。
root@GZFS2B:/root/.ssh/id_dsa.pub /root/.ssh/id_dsa.GZFS2B
系统提示是否继续安装,输入yes,并回车键确定。
提示输入密码,此时输入另外一台服务器(wxaipfs4)的Root用户密码,回车键确定。
cd /root/.ssh
cat id_dsa.GZFS2B >> authorized_keys2
在GZFS2B上执行以下命令。
scp root@GZFS2A:/root/.ssh/id_dsa.pub /root/.ssh/id_dsa.GZFS2A
cd /root/.ssh
cat id_dsa.GZFS2A >> authorized_keys2
步骤 3 在两台服务器上执行ssh命令。
如果还要输入密码才能登陆,就说明ssh信任还存在问题,需要删除/root/.ssh重新建立。
1.在GZFS2A上执行
ssh GZFS2B
2.在GZFS2B上执行
ssh GZFS2A
结束
来源:赛迪网 作者:yan
一般的系统是先启动/sbin/init,但是也可通过启动参数指定init=来确定,如:我的系统就是制定的init=/linuxrc,因为文件系统是采用busybox的,而linuxrc。也是一个指向busybox的文件,不过不确认它指向具体哪个指令。不过可能是/sbin/init。
init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。
如我的inittab:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::restart:/sbin/init
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
inittab的格式如下:
id:rstate:action:process
1.id字段是最多4个字符的字符串,用来唯一标志表项。
2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别)
3.action字段定义了该进程应该运行在何种状态下:
boot 在系统启动时运行,忽略runlevel
bootwait 在系统启动时运行,init等待进程完成。忽略runlevel
ctrlaltdel 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略 runlevel
initdefault 不要执行这个进程,它用于设置默认runlevel
kbrequest 当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
off 禁止进入,因此该进程不运行
once 每一个runlevel级别运行一次
ondemand 当系统指定特定的运行级别A、B、C时运行
powerfail 当init收到SIGPWR信号时运行
powerokwait 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
powerwait 当收到SIGPWD信号,并且init等待进程结束时运行
respawn 不管何时终止都重新启动进程
sysinit 在运行boot或bootwait进程之前运行
wait 运行进程等待输入运行模式
process 字段包含init执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,
因此process字段都以该进程的名字开头,紧跟着是运行时,紧跟着是运行时要传递给该进程的参数。
比如/sbin/shutdown -t3 -r now,该进程在按下Ctrl+Alt+Del时执行,在命令行下也可以直接输入来重新启动系统。
4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。
另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab.
他会先执行/etc/init.d/rcS
#! /bin/sh
/bin/mount -a
mdev -s
而mount -a会执行/etc/fstab
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
挂载一些ramfs。
来源:赛迪网 作者:fen
limits.conf的工作原理:
limits.conf的后端是这样工作的:limits.conf是pam_limits.so的配置文件,然后/etc/pam.d/下的应用程序调用pam_***.so模块。譬如说,当用户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。
例:限制admin用户登录到sshd的服务不能超过2个
在/etc/pam.d/sshd 中添加 session required pam_limits.so
在/etc/security/limits.conf中添加 admin – maxlogins 2
查看应用程序能否被PAM支持,用ldd
limits.conf文件的参数
Limits.conf文件的参数可以设置成以下两种形式之一:
暂时地,适用于通过 ulimit 命令登录 shell 会话期间。
永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或者通过编辑 /etc/security/limits.conf。
1.core – 限制内核文件的大小
何谓core文件,当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。 core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像。
系统默认core文件的大小为0,所以没有创建。可以用ulimit命令查看和修改core文件的大小。
$ulimit -c
0
$ ulimit -c 1000
$ ulimit -c
1000
-c 指定修改core文件的大小,1000指定了core文件大小。也可以对core文件的大小不做限制,如:
# ulimit -c unlimited
#ulimit -c
unlimited
如果想让修改永久生效,则需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。
2.nofile – 打开文件的最大数目
对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用 ulimit –n,或者通过设置nofile 参数,为用户把文件描述符的数量设置得比默认值高一些。
装tp-fancontrol,限制一下gpu的温度
ubuntuCPU的温度cat /proc/cpuinfo
显卡温度 有个sensor applet,装了都能显示
在终端里运行cpufreq-info查看CPU信息
sudo cpufreq-selector -c cpu号
或者 sudo cpufreq-set -c cpu号
选择要调整的CPU(因为你的电脑上可能不止一个CPU)
sudo cpufreq-selector -f 你所需要的频率
或者 sudo cpufreq-set -f 你所需要的频率
调整cpu频率,注意,此处的频率必须是以KHz为单位,并且是可以达到的频率(也就是用cpufreq-info查看到的各个频率)
也可以
sudo cpufreq-selecotr -g 模式
或者
suod cpufreq-set -g 模式
这里,模式就是执行cpufreq-info后看到的所支持的模式。
比如以下几种:powersave, userspace, ondemand, conservative, performance。
powersave,是无论如何都只会保持最低频率的所谓“省电”模式;
userspace,是自定义频率时的模式,这个是当你设定特定频率时自动转变的;
ondemand,一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率;
conservative,翻译成保守的,也就是默认的模式,一般选择这个,会自动在频率上下限调整;
performance,顾名思义只注重效率,无论如何一直保持以最大频率运行。
工具:
lm-sensors sensors-applet
手动配置传感器sudo sensors-detect
查看添加的模块less /etc/modules
其他监控软件:
xsensors ksensors
gdesklets gkrellm
硬盘监控hddtemp
来源:赛迪网 作者:fen
一、设置IP
我们可以为网卡设置固定的IP,也可设置一个用于测试的临时IP。要设置一个固定IP,可以通过命令setup和netconfig或通过修过配置文件来完成。
1、本例我们假设已配置了第1个网卡的IP,将为第2个网卡配置IP地址。过程如下:
[root@OracleOnLinux root]# cd /etc/sysconfig/network-scripts/
[root@OracleOnLinux network-scripts]# ls //查看当前目录中的文件,可以看到没有第2个网卡的配置文件
ifcfg-eth0 ifdown-ipv6 ifup ifup-isdn ifup-sit
ifcfg-lo ifdown-isdn ifup-aliases ifup-plip ifup-sl
ifdown ifdown-post ifup-cipcb ifup-plusb ifup-wireless
ifdown-aliases ifdown-ppp ifup-ippp ifup-post init.ipv6-global
ifdown-cipcb ifdown-sit ifup-ipv6 ifup-ppp network-functions
ifdown-ippp ifdown-sl ifup-ipx ifup-routes network-functions-ipv6
[root@OracleOnLinux network-scripts]# cat ifcfg-eth0 //通过配置文件查看eth0的配置
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.154
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
[root@OracleOnLinux network-scripts]# cp ifcfg-eth0 ifcfg-eth1 //拷贝一份以建立第二个网卡eth1的配置文件
[root@OracleOnLinux network-scripts]# vi ifcfg-eth1 //修改原配置文件为以下内容
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.16.0.254
NETMASK=255.255.255.0
GATEWAY=172.16.0.1
~
“ifcfg-eth1″ [已转换] 6L, 101C 已写入
[root@OracleOnLinux network-scripts]# service network restart //重启网络服务,使修改生效
正在关闭接口 eth0: [ 确定 ]
正在关闭接口 eth1: [ 确定 ]
关闭环回接口: [ 确定 ]
设置网络参数: [ 确定 ]
弹出环回接口: [ 确定 ]
弹出界面 eth0: [ 确定 ]
弹出界面 eth1: [ 确定 ]
[root@OracleOnLinux network-scripts]# ifconfig //查看当前IP的配置,可见第二个网卡的IP已配置成功
eth0 Link encap:Ethernet HWaddr 00:0C:29:2E:70:80
inet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:963 errors:0 dropped:0 overruns:0 frame:0
TX packets:664 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:87678 (85.6 Kb) TX bytes:67862 (66.2 Kb)
Interrupt:10 Base address:0×1080
[root@OracleOnLinux network-scripts]# ifconfig | grep inet //只查看IP部分
inet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0
inet addr:172.16.0.254 Bcast:172.16.0.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:2E:70:8A
inet addr:172.16.0.254 Bcast:172.16.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:192 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:15035 (14.6 Kb) TX bytes:168 (168.0 b)
Interrupt:9 Base address:0×1400
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1618 (1.5 Kb) TX bytes:1618 (1.5 Kb)
2、现在我们来设置一个临时用于测试的IP
[root@OracleOnLinux network-scripts]# ifconfig eth0:1 10.0.0.254 netmask 255.255.255.0 //对eth0再分配一个临时IP
[root@OracleOnLinux network-scripts]# ifconfig | more
eth0 Link encap:Ethernet HWaddr 00:0C:29:2E:70:80
inet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0
…… //可见临时IP已设置好
inet addr:10.0.0.254 Bcast:10.255.255.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:269 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:20922 (20.4 Kb) TX bytes:168 (168.0 b)
Interrupt:10 Base address:0×1080
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:2E:70:80
eth1 Link encap:Ethernet HWaddr 00:0C:29:2E:70:8A
inet addr:172.16.0.254 Bcast:172.16.0.255 Mask:255.255.255.0
……
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
……
[root@OracleOnLinux network-scripts]# service network restart //重启网络服务
[root@OracleOnLinux network-scripts]# ifconfig | more //再次查看设置的临时IP已消失
eth0 Link encap:Ethernet HWaddr 00:0C:29:2E:70:80
inet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0
……
eth1 Link encap:Ethernet HWaddr 00:0C:29:2E:70:8A
inet addr:172.16.0.254 Bcast:172.16.0.255 Mask:255.255.255.0
……
===================================================================================================
二、设置路由
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
……
1、查看本地路由
[root@linux-tys root]# netstat -rn //查看本机路由表,也可用route命令
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
12.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 12.0.0.254 0.0.0.0 UG 0 0 0 eth0
2、添加一条路由
[root@linux-tys root]# route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.0.154 dev eth0 //添加一个网络路由
[root@linux-tys root]# route add -host 172.16.0.169 gw 172.16.0.254 //添加一个主机路由
[root@linux-tys root]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
172.16.0.169 172.16.0.254 255.255.255.255 UGH 0 0 0 eth1
192.168.3.0 192.168.0.154 255.255.255.0 UG 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
12.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 12.0.0.254 0.0.0.0 UG 0 0 0 eth0
———————————
注:
Flags:路由标志。其中U表示路由项是活动的;H表示目标为单个主机;G表示使用网关;R表对动态路由进行修复;D表示路由项是动态安装的;M表示动态修改路由;!表示拒绝路由。
Ref:依赖于本路由的其它路由数目。
Use:该路由项被使用的次数。
Iface:该路由项发送数据包使用的网络接口。
——————————————————-
[root@linux-tys root]# route del -net 192.168.3.0 netmask 255.255.255.0 //删除网络路由
[root@linux-tys root]# route del -host 172.16.0.169 //删除主机路由
[root@linux-tys root]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
12.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 12.0.0.254 0.0.0.0 UG 0 0 0 eth0
三、用命令ping测试网络连通性
[root@linux-tys root]# ping 192.168.0.16 //本命令需用用ctrl+c中止
PING 192.168.0.16 (192.168.0.16) 56(84) bytes of data.
64 bytes from 192.168.0.16: icmp_seq=1 ttl=64 time=0.550 ms
64 bytes from 192.168.0.16: icmp_seq=2 ttl=64 time=0.341 ms
64 bytes from 192.168.0.16: icmp_seq=3 ttl=64 time=0.222 ms
64 bytes from 192.168.0.16: icmp_seq=4 ttl=64 time=0.220 ms
64 bytes from 192.168.0.16: icmp_seq=5 ttl=64 time=0.208 ms
64 bytes from 192.168.0.16: icmp_seq=6 ttl=64 time=0.274 ms
— 192.168.0.16 ping statistics —
6 packets transmitted, 6 received, 0% packet loss, time 5095ms
rtt min/avg/max/mdev = 0.208/0.302/0.550/0.120 ms
[root@linux-tys root]# ping –help //查看帮助
ping: invalid option — -
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[root@linux-tys root]# ping -c 4 -s 1000 192.168.0.16
PING 192.168.0.16 (192.168.0.16) 1000(1028) bytes of data.
1008 bytes from 192.168.0.16: icmp_seq=1 ttl=64 time=0.314 ms
1008 bytes from 192.168.0.16: icmp_seq=2 ttl=64 time=0.251 ms
1008 bytes from 192.168.0.16: icmp_seq=3 ttl=64 time=0.231 ms
1008 bytes from 192.168.0.16: icmp_seq=4 ttl=64 time=0.233 ms
— 192.168.0.16 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3058ms
rtt min/avg/max/mdev = 0.231/0.257/0.314/0.035 ms
四、命令netstat的使用
1、netstat命令常用参数简介
1) –t 显示当前TCP协议连接情况
2) –l 查看系统监听情况
3)–ln 同上,但将以数字形式表示端口信息
4)netstat –i 查看网卡传送、接收数据包的情况
5) –an 查看所有连接,并以数字形式表示端口信息
6) –r 查看本机的路由
2、netstat命令使用示例
[root@linux-tys root]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:1024 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1025 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 52 192.168.0.154:22 192.168.0.16:1059 ESTABLISHED
tcp 0 0 192.168.0.154:22 192.168.0.16:1049 ESTABLISHED
udp 0 0 0.0.0.0:1024 0.0.0.0:*
udp 0 0 0.0.0.0:10000 0.0.0.0:*
udp 0 0 0.0.0.0:846 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:631 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 8474 /tmp/.esd/socket
unix 13 [ ] DGRAM 1580 /dev/log
unix 2 [ ACC ] STREAM LISTENING 7552 /tmp/.fam_socket
unix 2 [ ACC ] STREAM LISTENING 2161 /tmp/.font-unix/fs7100
unix 2 [ ACC ] STREAM LISTENING 8553 /tmp/ssh-XXVkjhRL/agent.4243
unix 2 [ ACC ] STREAM LISTENING 6092 /tmp/ssh-XXG3eSwq/agent.3773
unix 2 [ ] STREAM 8473
unix 3 [ ] STREAM CONNECTED 7727 /tmp/.famaJaaeu
unix 3 [ ] STREAM CONNECTED 7726
unix 2 [ ] DGRAM 5428
unix 2 [ ] DGRAM 5165
unix 2 [ ] DGRAM 4860
unix 2 [ ] DGRAM 2237
unix 2 [ ] DGRAM 2192
unix 2 [ ] DGRAM 2179
unix 2 [ ] DGRAM 2055
unix 2 [ ] DGRAM 2013
unix 2 [ ] DGRAM 1771
unix 2 [ ] DGRAM 1630
unix 2 [ ] DGRAM 1595
[root@linux-tys root]# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 tys.linux.com:ssh 192.168.0.16:1059 ESTABLISHED
tcp 0 0 tys.linux.com:ssh 192.168.0.16:1049 ESTABLISHED
[root@linux-tys root]#
—–待续——–
本文出自 “lgzeng” 博客,请务必保留此出处http://lgzeng2360.blog.51cto.com/275998/132605
下面以查找结构体FILE的原始定义为例:
1、我们知道,这些定义一般都在 /usr/include下面,所以首先到达目录 /usr/include 下面
2、用grep命令搜索 ,即 grep ‘FILE’ stdio.h,可得以下结果(部分),FILE在stdio.h中定义有好多地方提到过。
#if !defined __need_FILE && !defined __need___FILE
# define __need_FILE
# define __need___FILE
#endif /* Don’t need FILE. */
#if !defined __FILE_defined && defined __need_FILE
struct _IO_FILE;
typedef struct _IO_FILE FILE;
#if defined __USE_LARGEFILE64 || defined __USE_SVID || defined __USE_POSIX \
__USING_NAMESPACE_STD(FILE)
3、从上面的搜索结果可以看到,实际上是把 _IO_FILE 定义为FILE,于是又要查找 _IO_FILE的定义。
4、用grep命令,即执行 grep ‘_IO_FILE’ *.h ,得到以下结果(部分,因为全部太多了,我们要从大量的结果中找到关键内容,当然也可以通过管道 二次使用grep)
_G_config.h:#define _G_HAVE_IO_FILE_OPEN 1
_G_config.h:#define _G_IO_IO_FILE_VERSION 0×20001
libio.h:struct _IO_jump_t; struct _IO_FILE;
libio.h: struct _IO_FILE *_sbuf;
libio.h:struct _IO_FILE {
libio.h: struct _IO_FILE *_chain;
libio.h:#ifdef _IO_USE_OLD_IO_FILE
5、我们看到了libio.h:struct _IO_FILE { 这一行,所以知道 它是在libio.h中定义的,打开该文件,即可看到定义。