新聞中心
Linux作為一種優(yōu)秀的開源操作系統(tǒng),擁有許多優(yōu)秀的開發(fā)資源。但是在進(jìn)行開發(fā)操作中,大家也許會遇到類似于 “Linux 缺少 io.h” 的問題。這個(gè)問題一般出現(xiàn)在Linux內(nèi)核或驅(qū)動程序的開發(fā)過程中,可能會導(dǎo)致無法正常使用硬件設(shè)備或無法完成設(shè)備的數(shù)據(jù)交換等問題。所以,本篇文章將會介紹在出現(xiàn)Linux缺少io.h問題時(shí)的解決方案。

成都創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為高安企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,高安網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
一、什么是io.h
在講解解決方案之前,需要先簡單介紹一下io.h。io.h中的IO操作是指對設(shè)備文件進(jìn)行直接控制的操作,例如對端口進(jìn)行讀寫、對顯存進(jìn)行控制和對中斷向量表進(jìn)行設(shè)置等。在Linux下,io.h文件中包含了很多的宏定義和函數(shù)聲明,用以實(shí)現(xiàn)對硬件設(shè)備的控制,可以說是Linux下開發(fā)驅(qū)動程序或內(nèi)核時(shí)非常重要的頭文件。
二、為什么會缺少io.h
Linux的內(nèi)核和驅(qū)動程序一般都是由C語言編寫而成的,而io.h是C語言中的頭文件,因此在Linux開發(fā)過程中,通常需要包含該頭文件,才能進(jìn)行設(shè)備文件的IO操作。但是在實(shí)際的開發(fā)過程中,有時(shí)候會出現(xiàn)缺少io.h的情況。一般而言,這種情況可能有以下幾種原因:
1. 編譯器的版本較低,沒有包含io.h文件;
2. Linux操作系統(tǒng)版本不同,導(dǎo)致io.h不同;
3. 沒有正確把io.h文件所在的路徑添加到頭文件搜索路徑中。
無論哪種原因,缺失io.h都會導(dǎo)致在開發(fā)驅(qū)動程序或內(nèi)核時(shí)無法進(jìn)行設(shè)備的IO操作。
三、io.h文件的引用
針對Linux缺少io.h的問題,最基本的方式就是提供io.h文件。但是很多時(shí)候找到io.h文件并不容易,可能是因?yàn)閕o.h文件在舊的Linux版本中已經(jīng)被廢棄,或者是在當(dāng)前的Linux版本中沒有默認(rèn)提供io.h文件。因此,下面將會介紹三種引用io.h文件的方式。
1. 從Linux源代碼中獲取
在使用Linux的過程中,我們需要的io.h文件基本上都存在于內(nèi)核或者驅(qū)動源代碼中。我們可以從Linux的源代碼中找到對應(yīng)的io.h文件,并且根據(jù)自己的需要進(jìn)行不同版本的選擇。當(dāng)然,如果你對Linux的內(nèi)核或驅(qū)動程序不熟悉或不想重新編譯內(nèi)核的話,這種方式可能不是更優(yōu)的方案。
2. 從在線資源庫中獲取
Linux是一個(gè)開源的平臺,像 GitHub、GitLab、Packagecloud等等這些資源庫通常都可以找到我們需要的io.h文件。我們可以直接搜索出相關(guān)的文件,進(jìn)行下載和引用。在這種方式下,我們需要慎重選擇的是獲取資源的可靠性以及io.h文件的版本,盡量選擇與自己平臺相符合的版本。
3. 從本地搜索目錄中獲取
如果只是找不到io.h文件,最簡單的處理方式就是把io.h頭文件所在的目錄添加到搜索路徑之中。根據(jù)自己的環(huán)境,通常需要在CFLAGS環(huán)境變量中添加路徑,具體方式如下:
“`
export CFLAGS=”$CFLAGS -I/path/to/io.h”
“`
四、
在Linux開發(fā)過程中,若出現(xiàn)缺少io.h文件的問題,需要及時(shí)尋找好的解決方案。通常情況下,我們可以通過從Linux源代碼中獲取、從在線資源庫中獲取和從本地搜索目錄中獲取多種方式來引用io.h文件。但如何尋找好的方法和解決方案,還是要根據(jù)具體情況和環(huán)境來決定。在任何情況下,都需要多動手、多探索才能更好地掌握Linux操作系統(tǒng)的開發(fā)技巧。
相關(guān)問題拓展閱讀:
- arm-linux-gcc 安裝完成后,頭文件的包含路徑不正確,找不到stdio.h,如何修改???
- 在linux系統(tǒng)中如何查看cpu和io
- 如何查看Linux下進(jìn)程的IO活動狀況 Hey,Linux
arm-linux-gcc 安裝完成后,頭文件的包含路徑不正確,找不到stdio.h,如何修改???
要么你重新編譯 arm-linux-gcc,使用正確的配置。要么就在編譯的時(shí)候加 -I (大寫i)參數(shù)指定頭文件搜索路徑,比如
gcc -I/usr/local/arm/3.2/include a.c
在linux系統(tǒng)中如何查看cpu和io
在 Linux 系統(tǒng)中,可以使用以下命令查看 CPU 信息:
top: 顯示系統(tǒng)進(jìn)程的實(shí)時(shí)狀態(tài)
htop: 與 top 類似,但提供了更多的信息和更好的可視化
mpstat: 顯示多核 CPU 的狀拍蘆態(tài)
lscpu: 顯示系統(tǒng) CPU 的配置信息
查看 IO 信息,可以使用以下命令:
iostat : 用于檢測磁盤I/O的使用狀況
vmstat : 用于檢測虛擬內(nèi)存的使用狀況
mpstat : 用于檢測 CPU 和磁盤I/O的使用狀況
dstat : 用于檢測磁盤I/O,網(wǎng)絡(luò),CPU等系統(tǒng)資源首磨的使用狀況
需襲芹帶要注意的是這些命令需要安裝對應(yīng)的工具包
如何查看Linux下進(jìn)程的IO活動狀況 Hey,Linux
前段時(shí)間,幾臺測試服務(wù)器的Web應(yīng)用響應(yīng)速度非常慢,系統(tǒng)負(fù)載也比較高,> 10, 但CPU和內(nèi)存卻很閑,于是懷疑是磁盤的性能瓶頸,通過vmstat和iostat看到IO的讀寫量非常大,尤其是用iostat -x 1命令可以很直觀的看到IO的使用率一直在100%。
但究竟是什么進(jìn)程導(dǎo)致的高IO呢,由于每臺服務(wù)器上都有JBoss和MySQL的存在,JBoss會不停的產(chǎn)生很多小的數(shù)據(jù)文件和生成文本數(shù)據(jù)庫的數(shù)據(jù),而MySQL則會不停的從Master同步新的數(shù)據(jù)。因此我們懷疑是這兩個(gè)進(jìn)程導(dǎo)致的高IO,通過停止了JBoss和MySQL之后,IO立刻降為0%. 但我們還是不能確定誰是主因,于是尋找可以查看特定進(jìn)程IO的方法。
最后,找到了兩個(gè)方法可以查看進(jìn)程IO的活動狀況。
1. 之一個(gè)方法是通過一個(gè)python腳本來實(shí)現(xiàn)。
方法是將以下內(nèi)容另存為一個(gè)叫io.py的腳本中,然后直接以root身份執(zhí)行腳本,就可以看到如下圖所示的信息(由于我們已經(jīng)通過升級到SSD硬盤解決了MySQL的IO問題,所以不能提供關(guān)于MySQL的截圖了),其中出現(xiàn)次數(shù)最多,數(shù)據(jù)更大的進(jìn)程,就是導(dǎo)致高IO的主因。不過比較遺憾的是這個(gè)腳本并不能顯示進(jìn)程在每一秒的準(zhǔn)確的IO讀寫。
# vim io.py
# chmod +x io.py
# ./io.py
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by
import sys, os, time, signal, re
class DiskIO:
def __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0
def main():
argc = len(sys.argv)
if argc != 1:
print “usage: ./iotop”
sys.exit(0)
if os.getuid() != 0:
print “must be run as root”
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
os.system(‘echo 1 > /proc/sys/vm/block_dump’)
print “TASKPIDREAD WRITE”
while True:
os.system(‘dmesg -c > /tmp/diskio.log’)
l =
f = open(‘/tmp/diskio.log’, ‘r’)
line = f.readline()
while line:
m = re.match(\
‘^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)’, line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == “READ”:
item.reads = item.reads + 1
elif m.group(3) == “WRITE”:
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print “%-10s %10s %10d %10d” % \
(item.pname, item.pid, item.reads, item.writes)
def signal_handler(signal, frame):
os.system(‘echo 0 > /proc/sys/vm/block_dump’)
sys.exit(0)
if __name__==”__main__”:
main()
2. 另一個(gè)方法是將Linux的內(nèi)核升級到 >=2.6.20,然后安裝一個(gè)iotop軟件來實(shí)現(xiàn)。
不過這種改動并不適用于生產(chǎn)環(huán)境,因?yàn)樵赗HEL5.6和5.7上,內(nèi)核都在 2.6.20以下。但是它所顯示的結(jié)果是非常準(zhǔn)確的,所以對于新上線的機(jī)器以及測試環(huán)境,非常值得一試,具體方法如下:
下載和升級新內(nèi)核(>=2.6.20),編譯時(shí)打開 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 選項(xiàng)。
解壓內(nèi)核后進(jìn)入配置界面:
# wget
# tar jxvf linux-2.6.39.tar.gz
# mv linux-2.6.39 /usr/src/
# cd /usr/src/linux-2.6.39
# make oldconfig //使用make oldconfig可以繼承老的kernel的配置,為自己的配置省去很多麻煩。
# make menuconfig
把General setup – Enable per-task storage I/O accounting這個(gè)選項(xiàng)選上。
# vim .config
將#CONFIG_SYSFS_DEPRECATED_V2 is not set的注釋去掉的,將其改為y,即修改為CONFIG_SYSFS_DEPRECATED_V2=y。
保存內(nèi)核后編譯內(nèi)核:
# make
# make modules
# make modules_install
# make install
修改默認(rèn)以新的內(nèi)核啟動:
# vi /boot/grub/grub.conf
default=0
將新的內(nèi)核配置文件復(fù)制到/boot目錄:
# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39
重啟服務(wù)器:
# reboot
# uname –r
2.6.39
重啟完成后確認(rèn)內(nèi)核版本是否正確。
源碼安裝iotop所需的Python 2.7.2(>= 2.5):
# wget
# tar xzvf Python-2.7.2.tgz
# cd Python-2.7.2
# ./configure
# make; make install
下載并安裝iotop:
# wget
# tar -xjvf iotop-0.4.4.tar.bz2
# cd iotop-0.4.4
# python setup.py build
# python setup.py install
然后就可以使用iotop看到如下圖所示的信息:
linux 找不到io.h的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 找不到io.h,Linux 缺少 io.h 怎么辦?,arm-linux-gcc 安裝完成后,頭文件的包含路徑不正確,找不到stdio.h,如何修改啊?,在linux系統(tǒng)中如何查看cpu和io,如何查看Linux下進(jìn)程的IO活動狀況 Hey,Linux的信息別忘了在本站進(jìn)行查找喔。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
當(dāng)前文章:Linux 缺少 io.h 怎么辦? (linux 找不到io.h)
網(wǎng)站URL:http://www.5511xx.com/article/cdsdish.html


咨詢
建站咨詢
