pythonioctl
❶ 如何透過python 來呼叫 ioctl
eth1似乎是linux下的命名方法,Mac OS不是這么定義的。前排童鞋說的,先查一下有沒有eth1這個設備。
❷ Python可以做系統底層開發嗎
可以的,因為pytho可以調用系統的API,C怎麼調用,python一樣怎麼調用就行。
具體如何實現可以參考:python灰帽子一書,這本書的中文版網上到處有下,一下就好
下面是目錄:看看吧,沒什麼不能做的
目錄
· · · · · ·
第1章 搭建開發環境 1
1.1 操作系統要求 1
1.2 獲取和安裝Python 2.5 2
1.2.1 在Windows下安裝Python 2
1.2.2 在Linux下安裝Python 2
1.3 安裝Eclipse和PyDev 4
1.3.1 黑客摯友:ctype庫 5
1.3.2 使用動態鏈接庫 6
1.3.3 構建C數據類型 8
1.3.4 按引用傳參 9
1.3.5 定義結構體和聯合體 9
第2章 調試器原理和設計 12
2.1 通用寄存器 13
2.2 棧 15
2.3 調試事件 17
2.4 斷點 18
2.4.1 軟斷點 18
2.4.2 硬體斷點 20
2.4.3 內存斷點 22
第3章 構建自己的Windows調試器 24
3.1 Debugee,敢問你在何處 24
3.2 獲取寄存器狀態信息 33
3.2.1 線程枚舉 34
3.2.2 功能整合 35
3.3 實現調試事件處理常式 39
3.4 無所不能的斷點 44
3.4.1 軟斷點 44
3.4.2 硬體斷點 49
3.4.3 內存斷點 55
3.5 總結 59
第4章 PyDbg——Windows下的純Python調試器 60
4.1 擴展斷點處理常式 60
4.2 非法內存操作處理常式 63
4.3 進程快照 66
4.3.1 獲取進程快照 67
4.3.2 匯總與整合 70
第5章 Immunity Debugger——兩極世界的最佳選擇 74
5.1 安裝Immunity Debugger 74
5.2 Immunity Debugger 101 75
5.2.1 PyCommand命令 76
5.2.2 PyHooks 76
5.3 Exploit(漏洞利用程序)開發 78
5.3.1 搜尋exploit友好指令 78
5.3.2 「壞」字元過濾 80
5.3.3 繞過Windows 下的DEP機制 82
5.4 破除惡意軟體中的反調試常式 87
5.4.1 IsDebuugerPresent 87
5.4.2 破除進程枚舉常式 88
第6章 鉤子的藝術 90
6.1 使用PyDbg部署軟鉤子 90
6.2 使用Immunity Debugger部署硬鉤子 95
第7章 DLL注入與代碼注入技術 101
7.1 創建遠程線程 101
7.1.1 DLL注入 102
7.1.2 代碼注入 105
7.2 遁入黑暗 108
7.2.1 文件隱藏 109
7.2.2 構建後門 110
7.2.3 使用py2exe編譯Python代碼 114
第8章 Fuzzing 117
8.1 幾種常見的bug類型 118
8.1.1 緩沖區溢出 118
8.1.2 整數溢出 119
8.1.3 格式化串攻擊 121
8.2 文件Fuzzer 122
8.3 後續改進策略 129
8.3.1 代碼覆蓋率 129
8.3.2 自動化靜態分析 130
第9章 Sulley 131
9.1 安裝Sulley 132
9.2 Sulley中的基本數據類型 132
9.2.1 字元串 133
9.2.2 分隔符 133
9.2.3 靜態和隨機數據類型 134
9.2.4 二進制數據 134
9.2.5 整數 134
9.2.6 塊與組 135
9.3 行刺WarFTPD 136
9.3.1 FTP 101 137
9.3.2 創建FTP協議描述框架 138
9.3.3 Sulley會話 139
9.3.4 網路和進程監控 140
9.3.5 Fuzzing測試以及Sulley的Web界面 141
第10章 面向Windows驅動的Fuzzing測試技術 145
10.1 驅動通信基礎 146
10.2 使用Immunity Debugger進行驅動級的Fuzzing測試 147
10.3 Driverlib——面向驅動的靜態分析工具 151
10.3.1 尋找設備名稱 152
10.3.2 尋找IOCTL分派常式 153
10.3.3 搜尋有效的IOCTL控制碼 155
10.4 構建一個驅動Fuzzer 157
第11章 IDAPython——IDA PRO環境下的Python腳本編程 162
11.1 安裝IDAPython 163
11.2 IDAPython函數 164
11.2.1 兩個工具函數 164
11.2.2 段(Segment) 164
11.2.3 函數 165
11.2.4 交叉引用 166
11.2.5 調試器鉤子 166
11.3 腳本實例 167
11.3.1 搜尋危險函數的交叉代碼 168
11.3.2 函數覆蓋檢測 169
11.3.3 檢測棧變數大小 171
第12章 PYEmu——腳本驅動式模擬器 174
12.1 安裝PyEmu 174
12.2 PyEmu概覽 175
12.2.1 PyCPU 175
12.2.2 PyMemory 176
12.2.3 PyEmu 176
12.2.4 指令執行 176
12.2.5 內存修改器與寄存器修改器 177
12.2.6 處理常式(Handler) 177
12.3 IDAPyEmu 182
12.3.1 函數模擬 184
12.3.2 PEPyEmu 187
12.3.3 可執行文件加殼器 188
12.3.4 UPX加殼器 188
12.3.5 利用PEPyEmu脫UPX殼 189
❸ python程序運行後提示IOError: [Errno 22] Invalid argument 急啊!!!!
python程序運行後提示IOError: [Errno 22] Invalid argument是設置錯誤造成的,解決方法為:
1、根據提示找到錯誤代碼處進行查看,是open函數出了問題。
❹ python灰帽子講的什麼
內容簡介
《Python灰帽子》是由知名安全機構Immunity Inc的資深黑帽Justin Seitz主筆撰寫的一本關於編程語言Python如何被廣泛應用於黑客與逆向工程領域的書籍。老牌黑客,同時也是Immunity Inc的創始人兼首席技術執行官(CTO)Dave Aitel為這本書擔任了技術編輯一職。書中絕大部分篇幅著眼於黑客技術領域中的兩大經久不衰的話題:逆向工程與漏洞挖掘,並向讀者呈現了幾乎每個逆向工程師或安全研究人員在日常工作中所面臨的各種場景,其中包括:如何設計與構建自己的調試工具,如何自動化實現煩瑣的逆向分析任務,如何設計與構建自己的fuzzing工具,如何利用fuzzing 測試來找出存在於軟體產品中的安全漏洞,一些小技巧諸如鉤子與注入技術的應用,以及對一些主流Python安全工具如PyDbg、 Immunity Debugger、Sulley、IDAPython、PyEmu等的深入介紹。作者藉助於如今黑客社區中備受青睞的編程語言 Python引領讀者構建出精悍的腳本程序來一一應對上述這些問題。出現在書中的相當一部分Python代碼實例借鑒或直接來源於一些優秀的開源安全項目,諸如Pedram Amini的Paimei,由此讀者可以領略到安全研究者們是如何將黑客藝術與工程技術優雅融合來解決那些棘手問題的。
相關推薦:《Python教程》
作者簡介
Justin Seitz是一名Immunity公司的高級安全研究員,他在以往的工作中花費了大量的時間從事漏洞挖掘、逆向工程、編寫漏洞利用以及編寫Python代碼的研究。
目錄
第1章 搭建開發環境 1
1.1 操作系統要求 1
1.2 獲取和安裝Python 2.5 2
1.2.1 在Windows下安裝Python 2
1.2.2 在Linux下安裝Python 2
1.3 安裝Eclipse和PyDev 4
1.3.1 黑客摯友:ctype庫 5
1.3.2 使用動態鏈接庫 6
1.3.3 構建C數據類型 8
1.3.4 按引用傳參 9
1.3.5 定義結構體和聯合體 9
第2章 調試器原理和設計 12
2.1 通用寄存器 13
2.2 棧 15
2.3 調試事件 17
2.4 斷點 18
2.4.1 軟斷點 18
2.4.2 硬體斷點 20
2.4.3 內存斷點 22
第3章 構建自己的Windows調試器 24
3.1 Debugee,敢問你在何處 24
3.2 獲取寄存器狀態信息 33
3.2.1 線程枚舉 34
3.2.2 功能整合 35
3.3 實現調試事件處理常式 39
3.4 無所不能的斷點 44
3.4.1 軟斷點 44
3.4.2 硬體斷點 49
3.4.3 內存斷點 55
3.5 總結 59
第4章 PyDbg——Windows下的純Python調試器 60
4.1 擴展斷點處理常式 60
4.2 非法內存操作處理常式 63
4.3 進程快照 66
4.3.1 獲取進程快照 67
4.3.2 匯總與整合 70
第5章 Immunity Debugger——兩極世界的最佳選擇 74
5.1 安裝Immunity Debugger 74
5.2 Immunity Debugger 101 75
5.2.1 PyCommand命令 76
5.2.2 PyHooks 76
5.3 Exploit(漏洞利用程序)開發 78
5.3.1 搜尋exploit友好指令 78
5.3.2 「壞」字元過濾 80
5.3.3 繞過Windows 下的DEP機制 82
5.4 破除惡意軟體中的反調試常式 87
5.4.1 IsDebuugerPresent 87
5.4.2 破除進程枚舉常式 88
第6章 鉤子的藝術 90
6.1 使用PyDbg部署軟鉤子 90
6.2 使用Immunity Debugger部署硬鉤子 95
第7章 DLL注入與代碼注入技術 101
7.1 創建遠程線程 101
7.1.1 DLL注入 102
7.1.2 代碼注入 105
7.2 遁入黑暗 108
7.2.1 文件隱藏 109
7.2.2 構建後門 110
7.2.3 使用py2exe編譯Python代碼 114
第8章 Fuzzing 117
8.1 幾種常見的bug類型 118
8.1.1 緩沖區溢出 118
8.1.2 整數溢出 119
8.1.3 格式化串攻擊 121
8.2 文件Fuzzer 122
8.3 後續改進策略 129
8.3.1 代碼覆蓋率 129
8.3.2 自動化靜態分析 130
第9章 Sulley 131
9.1 安裝Sulley 132
9.2 Sulley中的基本數據類型 132
9.2.1 字元串 133
9.2.2 分隔符 133
9.2.3 靜態和隨機數據類型 134
9.2.4 二進制數據 134
9.2.5 整數 134
9.2.6 塊與組 135
9.3 行刺WarFTPD 136
9.3.1 FTP 101 137
9.3.2 創建FTP協議描述框架 138
9.3.3 Sulley會話 139
9.3.4 網路和進程監控 140
9.3.5 Fuzzing測試以及Sulley的Web界面 141
第10章 面向Windows驅動的Fuzzing測試技術 145
10.1 驅動通信基礎 146
10.2 使用Immunity Debugger進行驅動級的Fuzzing測試 147
10.3 Driverlib——面向驅動的靜態分析工具 151
10.3.1 尋找設備名稱 152
10.3.2 尋找IOCTL分派常式 153
10.3.3 搜尋有效的IOCTL控制碼 155
10.4 構建一個驅動Fuzzer 157
第11章 IDAPython——IDA PRO環境下的Python腳本編程 162
11.1 安裝IDAPython 163
11.2 IDAPython函數 164
11.2.1 兩個工具函數 164
11.2.2 段(Segment) 164
11.2.3 函數 165
11.2.4 交叉引用 166
11.2.5 調試器鉤子 166
11.3 腳本實例 167
11.3.1 搜尋危險函數的交叉代碼 168
11.3.2 函數覆蓋檢測 169
11.3.3 檢測棧變數大小 171
第12章 PYEmu——腳本驅動式模擬器 174
12.1 安裝PyEmu 174
12.2 PyEmu概覽 175
12.2.1 PyCPU 175
12.2.2 PyMemory 176
12.2.3 PyEmu 176
12.2.4 指令執行 176
12.2.5 內存修改器與寄存器修改器 177
12.2.6 處理常式(Handler) 177
12.3 IDAPyEmu 182
12.3.1 函數模擬 184
12.3.2 PEPyEmu 187
12.3.3 可執行文件加殼器 188
12.3.4 UPX加殼器 188
12.3.5 利用PEPyEmu脫UPX殼 189
❺ python 獲取ssh響應嗎
最近在做一個項目,需要在客戶端集成一個互動式ssh功能,大概就是客戶端跟伺服器申請個可用的機器,服務端返回個ip,埠,密碼, 然後客戶端就可以直接登錄到機器上操做了。該程序基於paramiko模塊。
經查找,從paramiko的源碼包demos目錄下,可以看到互動式shell的實現,就是那個demo.py。但是用起來有些bug,於是我給修改了一下interactive.py(我把windows的代碼刪掉了,剩下的只能在linux下用)。代碼如下:
[python]view plain
#coding=utf-8
importsocket
importsys
importos
importtermios
importtty
importfcntl
importsignal
importstruct
importselect
now_channel=None
definteractive_shell(chan):
posix_shell(chan)
defioctl_GWINSZ(fd):
try:
cr=struct.unpack('hh',fcntl.ioctl(fd,termios.TIOCGWINSZ,'aaaa'))
except:
return
returncr
defgetTerminalSize():
cr=ioctl_GWINSZ(0)orioctl_GWINSZ(1)orioctl_GWINSZ(2)
returnint(cr[1]),int(cr[0])
defresize_pty(signum=0,frame=0):
width,height=getTerminalSize()
ifnow_channelisnotNone:
now_channel.resize_pty(width=width,height=height)
defposix_shell(chan):
globalnow_channel
now_channel=chan
resize_pty()
signal.signal(signal.SIGWINCH,resize_pty)#終端大小改變時,修改pty終端大小
stdin=os.fdopen(sys.stdin.fileno(),'r',0)#stdinbuff置為空,否則粘貼多位元組或者按方向鍵的時候顯示不正確
fd=stdin.fileno()
oldtty=termios.tcgetattr(fd)
newtty=termios.tcgetattr(fd)
newtty[3]=newtty[3]|termios.ICANON
try:
termios.tcsetattr(fd,termios.TCSANOW,newtty)
tty.setraw(fd)
tty.setcbreak(fd)
chan.settimeout(0.0)
whileTrue:
try:
r,w,e=select.select([chan,stdin],[],[])
except:
#解決SIGWINCH信號將休眠的select系統調用喚醒引發的系統中斷,忽略中斷重新調用解決。
continue
ifchaninr:
try:
x=chan.recv(1024)
iflen(x)==0:
print'rn***EOFrn',
break
sys.stdout.write(x)
sys.stdout.flush()
exceptsocket.timeout:
pass
ifstdininr:
x=stdin.read(1)
iflen(x)==0:
break
chan.send(x)
finally:
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)
#coding=utf8
importparamiko
importinteractive
#記錄日誌
paramiko.util.log_to_file('/tmp/aaa')
#建立ssh連接
ssh=paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.11',port=22,username='hahaha',password='********',compress=True)
#建立互動式shell連接
channel=ssh.invoke_shell()
#建立互動式管道
interactive.interactive_shell(channel)
#關閉連接
channel.close()
ssh.close()
使用示例:
[python]view plain
interactive.py代碼中主要修復了幾個問題:
1、當讀取鍵盤輸入時,方向鍵會有問題,因為按一次方向鍵會產生3個位元組數據,我的理解是按鍵一次會被select捕捉一次標准輸入有變化,但是我每次只處理1個位元組的數據,其他的數據會存放在輸入緩沖區中,等待下次按鍵的時候一起發過去。這就導致了本來3個位元組才能完整定義一個方向鍵的行為,但是我只發過去一個位元組,所以終端並不知道我要干什麼。所以沒有變化,當下次觸發按鍵,才會把上一次的信息完整發過去,看起來就是按一下方向鍵有延遲。多位元組的粘貼也是一個原理。解決辦法是將輸入緩沖區置為0,這樣就沒有緩沖,有多少發過去多少,這樣就不會有那種顯示的延遲問題了。
2、終端大小適應。paramiko.channel會創建一個pty(偽終端),有個默認的大小(width=80, height=24),所以登錄過去會發現能顯示的區域很小,並且是固定的。編輯vim的時候尤其痛苦。channel中有resize_pty方法,但是需要獲取到當前終端的大小。經查找,當終端窗口發生變化時,系統會給前台進程組發送SIGWINCH信號,也就是當進程收到該信號時,獲取一下當前size,然後再同步到pty中,那pty中的進程等於也感受到了窗口變化,也會收到SIGWINCH信號。
3、讀寫『慢』設備(包括pipe,終端設備,網路連接等)。讀時,數據不存在,需要等待;寫時,緩沖區滿或其他原因,需要等待。ssh通道屬於這一類的。本來進程因為網路沒有通信,select調用為阻塞中的狀態,但是當終端窗口大小變化,接收到SIGWINCH信號被喚醒。此時select會出現異常,觸發系統中斷(4, 'Interrupted system call'),但是這種情況只會出現一次,當重新調用select方法又會恢復正常。所以捕獲到select異常後重新進行select可以解決該問題。
❻ windows python3 怎樣獲得os的返回值
解決:查閱了文檔發現os.system()的返回為:
On Unix, the return value is the exit status of the process encoded in the format specified for wait().
而os.wait()的返回為:
a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number
is zero);
os.system的返回值並不是執行程序的返回結果。而是一個16位的數,它的高位才是返回碼。也就是說os.system()返回256即 0×0100,返回碼應該是其高位0×01即1。所以要獲取程序運行退出的值(比如C的main函數中的return 0),需要處理一下。
ret = os.system('./a.out')
ret >>= 8
這樣才能獲取到正確的返回值。另外還要注意:python獲取到的值是無符號整數,所以返回負值的時候,列印出來是很大的正值。比如返回-1,python 會獲取到255,-2則254,以此類推。所以最好就判斷是否為0就可以了,實在要判斷自己寫的c程序返回值,建議返回0,1,2,3等值,出錯返回 -1。
另外,我遇到一次明明處理好了返回值,c程序調試信息提示也該返回值0了,結果python獲取到的是 -1,而且無論c程序返回多少,python都獲取-1。後來排查c程序的問題,發現原來是因為我這個python程序本身是由另一個C程序調用的,而調 用它的那個C程序中將SIGCLD信號忽略了(這表明python是根據子進程退出時產生的信號來獲取返回值的),我將那個C程序的SIGCLD綁定到函 數,即使那個函數什麼也不做,python也能獲取到正確的返回值了。
/**********************************************************************************************************************/
linux命令執行後無論成功與否都有一個返回值:
如果為 0,則表示命令執行成功,其它值則表示錯誤,具體的錯誤碼含義如下:
"OS error code 1: Operation not permitted"
"OS error code 2: No such file or directory"
"OS error code 3: No such process"
"OS error code 4: Interrupted system call"
"OS error code 5: Input/output error"
"OS error code 6: No such device or address"
"OS error code 7: Argument list too long"
"OS error code 8: Exec format error"
"OS error code 9: Bad file descriptor"
"OS error code 10: No child processes"
"OS error code 11: Resource temporarily unavailable"
"OS error code 12: Cannot allocate memory"
"OS error code 13: Permission denied"
"OS error code 14: Bad address"
"OS error code 15: Block device required"
"OS error code 16: Device or resource busy"
"OS error code 17: File exists"
"OS error code 18: Invalid cross-device link"
"OS error code 19: No such device"
"OS error code 20: Not a directory"
"OS error code 21: Is a directory"
"OS error code 22: Invalid argument"
"OS error code 23: Too many open files in system"
"OS error code 24: Too many open files"
"OS error code 25: Inappropriate ioctl for device"
"OS error code 26: Text file busy"
"OS error code 27: File too large"
"OS error code 28: No space left on device"
"OS error code 29: Illegal seek"
"OS error code 30: Read-only file system"
"OS error code 31: Too many links"
"OS error code 32: Broken pipe"
"OS error code 33: Numerical argument out of domain"
"OS error code 34: Numerical result out of range"
"OS error code 35: Resource deadlock avoided"
"OS error code 36: File name too long"
"OS error code 37: No locks available"
"OS error code 38: Function not implemented"
"OS error code 39: Directory not empty"
"OS error code 40: Too many levels of symbolic links"
"OS error code 42: No message of desired type"
"OS error code 43: Identifier removed"
"OS error code 44: Channel number out of range"
"OS error code 45: Level 2 not synchronized"
"OS error code 46: Level 3 halted"
"OS error code 47: Level 3 reset"
"OS error code 48: Link number out of range"
"OS error code 49: Protocol driver not attached"
"OS error code 50: No CSI structure available"
"OS error code 51: Level 2 halted"
"OS error code 52: Invalid exchange"
"OS error code 53: Invalid request descriptor"
"OS error code 54: Exchange full"
"OS error code 55: No anode"
"OS error code 56: Invalid request code"
"OS error code 57: Invalid slot"
"OS error code 59: Bad font file format"
"OS error code 60: Device not a stream"
"OS error code 61: No data available"
"OS error code 62: Timer expired"
"OS error code 63: Out of streams resources"
"OS error code 64: Machine is not on the network"
"OS error code 65: Package not installed"
"OS error code 66: Object is remote"
"OS error code 67: Link has been severed"
"OS error code 68: Advertise error"
"OS error code 69: Srmount error"
"OS error code 70: Communication error on send"
"OS error code 71: Protocol error"
"OS error code 72: Multihop attempted"
"OS error code 73: RFS specific error"
"OS error code 74: Bad message"
"OS error code 75: Value too large for defined data type"
"OS error code 76: Name not unique on network"
"OS error code 77: File descriptor in bad state"
"OS error code 78: Remote address changed"
"OS error code 79: Can not access a needed shared library"
"OS error code 80: Accessing a corrupted shared library"
"OS error code 81: .lib section in a.out corrupted"
"OS error code 82: Attempting to link in too many shared libraries"
"OS error code 83: Cannot exec a shared library directly"
"OS error code 84: Invalid or incomplete multibyte or wide character"
"OS error code 85: Interrupted system call should be restarted"
"OS error code 86: Streams pipe error"
"OS error code 87: Too many users"
"OS error code 88: Socket operation on non-socket"
"OS error code 89: Destination address required"
"OS error code 90: Message too long"
"OS error code 91: Protocol wrong type for socket"
"OS error code 92: Protocol not available"
"OS error code 93: Protocol not supported"
"OS error code 94: Socket type not supported"
"OS error code 95: Operation not supported"
"OS error code 96: Protocol family not supported"
"OS error code 97: Address family not supported by protocol"
"OS error code 98: Address already in use"
"OS error code 99: Cannot assign requested address"
"OS error code 100: Network is down"
"OS error code 101: Network is unreachable"
"OS error code 102: Network dropped connection on reset"
"OS error code 103: Software caused connection abort"
"OS error code 104: Connection reset by peer"
"OS error code 105: No buffer space available"
"OS error code 106: Transport endpoint is already connected"
"OS error code 107: Transport endpoint is not connected"
"OS error code 108: Cannot send after transport endpoint shutdown"
"OS error code 109: Too many references: cannot splice"
"OS error code 110: Connection timed out"
"OS error code 111: Connection refused"
"OS error code 112: Host is down"
"OS error code 113: No route to host"
"OS error code 114: Operation already in progress"
"OS error code 115: Operation now in progress"
"OS error code 116: Stale NFS file handle"
"OS error code 117: Structure needs cleaning"
"OS error code 118: Not a XENIX named type file"
"OS error code 119: No XENIX semaphores available"
"OS error code 120: Is a named type file"
"OS error code 121: Remote I/O error"
"OS error code 122: Disk quota exceeded"
"OS error code 123: No medium found"
"OS error code 124: Wrong medium type"
"OS error code 125: Operation canceled"
"OS error code 126: Required key not available"
"OS error code 127: Key has expired"
"OS error code 128: Key has been revoked"
"OS error code 129: Key was rejected by service"
"OS error code 130: Owner died"
"OS error code 131: State not recoverable"
❼ fcntl.ioctl(f, 0x107, pwm_struct),在python下的,坐等!
第一行:以可編輯模式打開文件
第二行:打包(..)使可識別
第三行:沒見過這個用法,ioctl應該是一個I/O函數,但是這么用不知道具體意思是什麼
這三行代碼應該是某個調用I/O驅動程序的一部分,目的是編輯驅動文件。
❽ python log 文件鎖判斷是否有鎖
Python的文件鎖目前使用的是fcntl這個庫,它實際上為 Unix上的ioctl,flock和fcntl 函數提供了一個介面。
1.fcntl庫的簡單使用
[python] view plain
import fcntl
import os, time
FILE = "counter.txt"
if not os.path.exists(FILE):
# create the counter file if it doesn't exist
file = open(FILE, "w")
file.write("0")
file.close()
for i in range(20):
file = open(FILE, "r+") #由於flock生成的是勸告鎖,不能阻止進程對文件的操作,所以這里可以正常打開文件
fcntl.flock(file.fileno(), fcntl.LOCK_EX) #為了避免同時操作文件,需要程序自己來檢查該文件是否已經被加鎖。這里如果檢查到加鎖了,進程會被阻塞
print 'acquire lock'
counter = int(file.readline()) + 1
file.seek(0)
file.write(str(counter))
print os.getpid(), "=>", counter
time.sleep(10)
file.close() # unlocks the file
print 'release lock'
time.sleep(3)
分別啟動2個進程來同時運行這個腳本,我們可以很明顯的看到2者互相之間交替阻塞。同一時刻只有一個進程能夠對counter.txt文件進行操作。
2.對fcntl.flock()函數的說明:
linux的flock() 的函數原型如下所示:
int flock(int fd, int operation);
其中,參數 fd 表示文件描述符;參數 operation 指定要進行的鎖操作,該參數的取值有如下幾種:
LOCK_SH:表示要創建一個共享鎖,在任意時間內,一個文件的共享鎖可以被多個進程擁有;
LOCK_EX:表示創建一個排他鎖,在任意時間內,一個文件的排他鎖只能被一個進程擁有;
LOCK_UN:表示刪除該進程創建的鎖;
LOCK_MAND:它主要是用於共享模式強制鎖,它可以與 LOCK_READ 或者 LOCK_WRITE聯合起來使用,從而表示是否允許並發的讀操作或者並發的寫操作;
通常情況下,如果加鎖請求不能被立即滿足,那麼系統調用 flock()會阻塞當前進程。比如,進程想要請求一個排他鎖,但此時,已經由其他進程獲取了這個鎖,那麼該進程將會被阻塞。如果想要在沒有獲得這個排他鎖的情況下不阻塞該進程,可以將LOCK_NB 和 LOCK_SH 或者 LOCK_EX 聯合使用,那麼系統就不會阻塞該進程。flock()所加的鎖會對整個文件起作用。
注意:
1. 對於文件的 close() 操作會使文件鎖失效;
2. 同理,進程結束後文件鎖失效;
3. flock() 的 LOCK_EX是「勸告鎖」,系統內核不會強制檢查鎖的狀態,需要在代碼中進行文件操作的地方顯式檢查才能生效。
❾ python求助 現在要寫一個加法和乘法的程序, 最開始def perform_test(a,b)
#coding:gbk
fromrandomimportrandint
defperform_test(a,b):
"""
:parama:1加法0乘法
:paramb:題目數量
:return:正確率
"""
right_count=0
ifb==0:
return0
foriinrange(b):
x=randint(0,100)#范圍自己定
y=randint(0,100)
ifa==0:
try:
z=input("%d*%d="%(x,y))
ifz==x*y:
right_count+=1
exceptException,e:
pass
elifa==1:
try:
z=input("%d+%d="%(x,y))
ifz==x+y:
right_count+=1
exceptException,e:
pass
returnfloat(right_count)/b
defchoose():
try:
b=input("totalcount:")
ifb==0:
print"goodbye"
return
a=input("add(1)/mul(0):")
ifa!=0anda!=1:
print"mustbe0or1."
return
exceptNameError,e:
printe.args
exceptException,e:
printe.args
ret=perform_test(a,b)
ifret>=0.8:
print"welldone."
elifret>=0.6andret<0.8:
print"nottoobad."
else:
print"pleasestudymore."
if__name__=="__main__":
print"welcome"
choose()
隨便寫了個, 你看看是不是你要的。
❿ 關於linux下python的一個問題
ioctl(s.fileno(),0x8915, pack('256s', ifname[:15]))返回的是一個可以當作列表的對象(可以是列表、字串什麼的)——後面的[20:24]是取第20到24位,方括弧里還可以用負數表示倒數,例如:
[12:] 從第12位(第12個)到最後。
[:-3] 從開頭到倒數第3位(倒數第3個)
[12:-3] ......