2010-10-08 39 views
3

我的sysopen失敗:

sysopen(DEV, "/dev/ttyS0", O_NONBLOCK|O_RDONLY) 

返回1,這是成功的!那麼,爲什麼$!有錯誤「非法尋求」在它(它是聯合國民主基金的調用之前)

before sysopen $!: 
after sysopen $!: Illegal seek 

編輯: 以下是完整的腳本:(使用實際O_NONBLOCK | O_RDONLY值2048)

#!/usr/bin/perl -w 
use Device::SerialPort; 
my $ob; 

$ob = new Device::SerialPort("/dev/ttyS0"); 

print $!, "\n"; 
$! = 0; 

my $ret = sysopen(DEV, "/dev/ttyS0", 2048); 

print $!, "\n"; 
$! = 0; 

print "ret from sysopen: ", $ret, "\n"; 
#my $dev = <DEV>; 

打印出: ./filehandle.pl 非法謀取非法 從尋求 RET的sysopen:1

+1

你是否看到'sysopen my $ ttyh,'/ dev/ttyS0',O_NONBLOCK | O_RDONLY或者'無法打開tty:$!';'? – Ether 2010-10-08 18:03:43

+2

始終發佈完整的演示腳本。隔離的代碼行不顯示您創建的問題。 – 2010-10-08 18:43:39

+0

以太網 - 我的錯誤與您的建議相同。 – dissectcode 2010-10-08 19:51:19

回答

16

那怎麼çerrno瓦里能幹的作品。從man errno引述如下: 返回值的呼叫的 指示錯誤(即,-1從最系統 調用; -1或從最庫函數NULL)只有當

它的值是顯著;功能 成功允許更改errno

$!只是Perl的接口errno,並具有same behavior

這意味着$!值 有意義的,只是立即一個 失敗後

您必須檢查返回值sysopen來確定它是否失敗。如果它失敗了,$!會告訴你爲什麼失敗,但你不能使用$!,以確定是否失敗(除非你使用特定的功能是記錄設置$! 0成功。大部分別噸,包括sysopen)。

+0

感謝您指出這一點!我整天都在努力工作 – dissectcode 2010-10-08 19:49:21

1

Perl中許多類似的特殊變量只有在必須時纔會更改它們的值。你總是應該檢查實際設置變量的條件。兩個最常見的例子是在出現錯誤時重置錯誤變量或在成功匹配時重置正則表達式捕獲變量。

unless(sysopen(...)) { 
     die "Error was $!"; 
     } 

if(m/(...)(...)/) { 
     print "Found $1 and $2\n"; 
     } 

這無疑是Perl的疣之一,因爲它依賴於遙遠的全局變量的副作用表示什麼地方發生的事情。在某些情況下甚至更糟,因爲在您有機會查看它之前,別的東西可以更改特殊變量,所以您應該在運行任何其他語句之前立即檢查它。

+0

這不是他的問題。這並不是說他太晚檢查了,其他的改變了。這是一個成功的函數仍然可以將'$!'設置爲非空值,但是**不**表示函數失敗。 – cjm 2010-10-08 18:45:53

+0

雖然解決方案是相同的。只有在將其設置爲有趣價值的條件下才能看到它。這是一個通用的最佳實踐。 – 2010-10-08 18:48:39

+0

我試圖使用它作爲錯誤檢查方法...謝謝你的信息,它有助於很多。 (我用你想要的完整腳本編輯我的原始文章) – dissectcode 2010-10-08 19:52:29

相關問題