2013-05-15 20 views

Trả lời

0

Chức năng fcntl() thực hiện các hành động khác nhau trên mô tả mở. cú pháp của nó là:

int fcntl(int descriptor, 
      int command, 
      ...) 

đọc về Return Value:

  • -1 sau đó fcntl() đã không thành công. Biến toàn cầu errno được đặt để cho biết lỗi.

mã này:

#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
int main(){ 
    int flags; 
    if((flags = fcntl(-1,F_GETFL,0)) < 0){ 
    perror("fcntl: "); 
    } 
    printf("\n %d\n", flags); 
} 

đầu ra là:

~$ gcc xx.c 
~$ ./a.out 
fcntl: : Bad file descriptor 

-1 

Thông báo đã in flags giá trị là -1 cho biết cuộc gọi không thành công fcntl(-1,F_GETFL,0);-1 không phải là một mô tả tập tin hợp lệ. Và valid file descriptors bắt đầu từ 0. (đó là những gì perror() in thông báo lỗi Bad file descriptor, EBADF)

lưu ý: Tôi chạy mã này trong hệ thống Linux.

Sửa:
F_GETFL là dành cho cờ GET lệnh trong fcntl().

+0

Vì vậy, mục đích của mã của bạn là gì, nhưng cho thấy rằng '-1' không phải là một mô tả tập tin hợp lệ :), cho tôi biết nếu bạn cần thêm trợ giúp về điều này. –

4

Lý do thông thường để gọi fcntl() với cờ F_GETFL là sửa đổi cờ và đặt chúng bằng fcntl()F_SETFL; lý do thay thế để gọi fcntl() với F_GETFL là tìm hiểu các đặc tính của bộ mô tả tệp. Bạn có thể tìm thấy thông tin về cờ nào có thể được điều khiển bằng cách đọc (thay vì cẩn thận) thông tin về <fcntl.h>. Các cờ bao gồm:

  • O_APPEND - Đặt chế độ nối thêm.
  • O_DSYNC - Viết theo hoàn thành tính toàn vẹn dữ liệu I/O được đồng bộ hóa.
  • O_NONBLOCK - Chế độ không chặn.
  • O_RSYNC - Các hoạt động I/O đã đọc đồng bộ hóa.
  • O_SYNC - Viết theo hoàn thành tính toàn vẹn tệp I/O được đồng bộ hóa.

Plus (POSIX 2008) O_ACCMODE mà sau đó có thể được sử dụng để phân biệt O_RDONLY, O_RDWRO_WRONLY, nếu tôi đọc các trang tham chiếu một cách chính xác.

Tuy nhiên, không có ý nghĩa gì khi gọi fcntl() với mô tả tệp không hợp lệ dứt khoát như -1. Tất cả những gì xảy ra là hàm trả về -1 cho biết lỗi và đặt errno thành EBADF (bộ mô tả tệp không hợp lệ).

3

Giả sử chúng ta đang nói về chức năng được mô tả bởi man 2 fcntl:

flags = fcntl(-1,F_GETFL,0); 

cố gắng để thực hiện một số hành động trên một bộ mô tả tập tin không hợp lệ (-1) và do đó sẽ không bao giờ làm bất cứ điều gì khác nhưng trở -1 và thiết lập errno đến EBADF.

Tôi muốn nói bạn Savely có thể thay thế dòng này bằng cách:

flags = -1; errno = EBADF; 
Các vấn đề liên quan