2014-07-04 25 views
8

Tôi đang thiết kế trình điều khiển thiết bị nhân vật Linux. Tôi muốn đặt errno khi lỗi xảy ra trong cuộc gọi hệ thống ioctl().Làm thế nào để thiết lập errno trong trình điều khiển thiết bị Linux?

long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg) 
{ 
    long ret = 0; 
    BOOL isErr = FALSE; 

    // some operation 
    // ... 

    if (isErr) { 
     // set errno 
     // ...     <--- What should I do? 
     ret = -1; 
    } 

    return ret; 
} 

Tôi nên làm gì để đạt được điều đó? Cảm ơn bạn trước!


Vui lòng cho phép tôi giải thích đơn đăng ký của mình chi tiết hơn.

Thiết bị của tôi nằm trong/dev/myCharDev. ứng dụng không gian sử dụng của tôi là như thế này:

#define _COMMAND     (1) 
#define _ERROR_COMMAND_PARAMETER (-1) 

int main() 
{ 
    int fd = open("/dev/myCharDec", O_RDONLY); 
    int errnoCopy; 

    if (fd) { 
     if (ioctl(fd, _COMMAND, _ERROR_COMMAND_PARAMETER) < 0) {  // should cause error in ioctl() 
      errnoCopy = errno; 
      printf("Oops, error occurred: %s\n", strerr(errnoCopy)); // I want this "errno" printed correctly 
     } 

     close(fd); 
    } 

    return 0; 
} 

Như tôi đã đề cập trong các ý kiến ​​trên, Làm thế nào tôi nên đặt "errno" trong mã điều khiển thiết bị của riêng tôi và làm cho nó có thể đọc được bằng cách áp dụng không gian sử dụng?

Trả lời

9

Câu hỏi hay!

Ok, bạn có thể nghĩ errno là biến toàn cầu (để được honnest, nó là một extern int). errno có rất nhiều macro được xác định trước cho mã lỗi trong thư viện errno.h. Bạn có thể xem here. Rất có thể một số mã lỗi này mô tả những gì bạn muốn hiển thị. Chọn đúng, đặt nó như thể nó là một biến bạn đã xác định, và (quan trọng!) Thoát ngay lập tức!

Bạn có thể tự hỏi mình nếu thiết lập errno là cách tiếp cận đúng với vấn đề của bạn. Bạn luôn có thể xác định (* int) và phát triển mã lỗi của riêng bạn và cơ chế xử lý lỗi. Mục đích của Errno là hiển thị và giải thích các lỗi hệ thống. Do u xem xét mã của bạn một phần của "hệ thống" (như tôi có thể thấy bạn phát triển cuộc gọi hệ thống của riêng bạn, vì vậy đây có thể là trường hợp)? Vì vậy, đi vào và sử dụng errno để giải thích "lỗi hệ thống" của bạn.

Chỉnh sửa (Cập nhật câu hỏi): Ok thêm thông tin. Như tôi đã nói errno là một int ex và được thiết lập bởi hạt nhân. Giá trị mà tại đó errno được đặt đơn giản là giá trị trả về của cuộc gọi hệ thống. Nhân Linux sau đó giải thích giá trị âm này thông qua thư viện errno.h. Vì vậy, một thông báo lỗi ví dụ được thiết lập đơn giản bằng cách trả về (EBUSY chỉ là một ví dụ - bạn có thể sử dụng tất cả các loại lỗi định trước) thông báo lỗi mà bạn muốn từ cuộc gọi hệ thống của mình. Ví dụ:

return -EBUSY 

Hy vọng nó giúp

+0

Tôi thêm một số giải thích trong câu hỏi của mình. –

+0

@AndrewChang đã cập nhật câu trả lời của tôi – sestus

+0

Rất tốt, cảm ơn bạn !!! –

0
if (isErr) 
    { 
     printk(KERN_ALERT "Error %d: your description\n", errno); 
     ret = errno; 
    } 

nơi, errno là giá trị trở lại của một số chức năng.

Trình điều khiển thiết bị của bạn phải luôn trả về trạng thái cho yêu cầu nhận được. Được ủng hộ bạn luôn sử dụng mã trả lại được liệt kê cũng như mã trả lại bình thường . Trả về 0 = pass 1 hoặc -1 = thất bại là mơ hồ và có thể gây hiểu nhầm.

đọc phần 3.1 Efficient error handling, reporting and recovery: để biết thêm thông tin

+0

Khi tôi nhận được nó, anh ta muốn tạo ra lỗi, và thiết lập errno cho phù hợp. Bạn chỉ cần đọc errno. Nhưng hệ thống gọi anh ta phát triển không đặt errno theo mặc định. Anh ta cần phải thiết lập nó. – sestus

+0

Đúng, những gì tôi hỏi là đặt errno trong "trình điều khiển thiết bị" thay vì các ứng dụng không gian của người dùng. –

6

Return số lỗi tiêu cực từ ioctl. Thư viện c giải thích điều này và đưa ra một mã trả về -1 và đặt errno thành lỗi dương. Ví dụ: ví dụ ban đầu của bạn sẽ đặt errno thành 1.

Để nguyên mẫu của bạn cho một hàm ioctl trong hạt nhân có vẻ sai. Bạn đang sử dụng phiên bản hạt nhân nào?

+0

Cảm ơn bạn! Tôi kết hợp câu trả lời của bạn và sestus và hiểu những gì tôi nên làm. Nhưng câu trả lời của sestus chi tiết hơn. Thật đáng tiếc khi chỉ có một câu trả lời có thể được chấp nhận. –

Các vấn đề liên quan