簡體   English   中英

Linux中的ioctl系統調用可以被信號打斷嗎?

[英]Can ioctl system calls in linux be interrupted by signals?

由於信號本質上是異步的,因此只要進程在內核模式或用戶模式下運行,就有可能中斷進程。

例如,在羅伯特·洛夫(Robert Love)的系統編程中,完成了讀取功能,該功能檢查-EINTR並將重新啟動系統調用,以讀取剩余字節。

ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
  if (ret == -1) {
    if (errno == EINTR)
      continue;
    perror ("read");
    break;
  }
  len -= ret;
  buf += ret;
}

我遇到了來自用戶空間的幾個ioctl調用,這些調用只是通過檢查錯誤代碼<0來返回錯誤。我發現在下面的鏈接中也做了類似的事情。

IOCTL調用並檢查返回值

其他系統調用(例如ioctl)是否需要相同的機制(在讀取調用中檢查-EINTR)? 不管我的程序是否涉及信號處理,是否總是有必要檢查每個-EINTR系統調用的返回碼?

我也聽說過linux支持某些系統調用的自動重啟功能,因此如果相應的ioctl調用失敗,驅動程序將返回-ERESTARTSYS,但是我不確定ioctl系統是否都屬於該類別並且可以透明地重啟,因此用戶空間不必擔心因信號中斷而導致ioctl失敗?

如果部分執行ioctl並在中間中斷信號會怎樣? 內核是否仍然在沒有用戶空間參與的情況下自動重啟ioctl調用?

Ioctl是設備驅動程序通配符調用(意味着驅動程序可以自由實現其想要的任何功能,無論是否處於休眠狀態),因此,如果它決定在某個事件上進入睡眠狀態, 則它還要確定是否希望被內核中斷中斷 如果它決定不被中斷,則內核僅在進程喚醒后才處理該中斷(或將其傳遞到未處於這種狀態的另一個線程)

無論如何,中斷僅在用戶模式下傳遞給用戶進程,因此內核永遠不會掛起系統調用,進入用戶模式執行用戶信號處理程序,然后返回內核模式以結束系統調用。 這將破壞系統調用的原子性。 如果ioctl調用以不可中斷模式休眠,則該信號將必須等待,並且在ioctl調用之后將發生任何處理程序(或由於中斷而導致的系統操作)。

在多線程環境中,如果多個線程中的一個處於這種情況,則具有多個線程的進程可以接收到中斷(另一個線程)。 內核只是將信號傳遞到能夠處理該信號的可用線程之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM