
介紹與基本概念
|
25
對某些函式而言,整個系列的傳回型別都是合法的傳回值。因此,調用此類函式之前,
必須把
errno
的值設為零,並於事後進行檢查(此類函式只會在實際發生錯誤時傳回非
零值的
error
)。例如:
errno = 0;
arg = strtoul (buf, NULL, 0);
if (errno)
perror ("strtoul");
檢查
errno
時常犯的錯誤,就是忘記任何程式庫或系統呼叫都可以改變它。例如,下面
這段有瑕疵的程式碼:
if (fsync (fd) ==
−
1) {
fprintf (stderr, "fsync failed!\n");
if (errno == EIO)
fprintf (stderr, "I/O error on %d!\n", fd);
}
要讓
errno
的值得以跨越函式調用,你必須保存它:
if (fsync (fd) ==
−
1) {
const int err = errno;
fprintf (stderr, "fsync failed: %s\n", strerror (errno));
if (err == EIO) {
/* 如果錯誤與 I/O 有關,棄船 */
fprintf (stderr, "I/O error on %d!\n", fd);
exit (EXIT_FAILURE);
}
}
在單執行緒的程式中,
errno
是個全域變數,正如本節稍早所述。然而,在多執行緒的
程式中,
errno
會按每個執行緒來儲存,因此具執行緒安全性。 ...