Tôi cố gắng để hiểu những gì dòng mã này có nghĩa là:Mục đích của việc gọi fcntl() được gọi với bộ mô tả tập tin là -1 và cmd như F_GETFL?
flags = fcntl(-1,F_GETFL,0);
Tôi cố gắng để hiểu những gì dòng mã này có nghĩa là:Mục đích của việc gọi fcntl() được gọi với bộ mô tả tập tin là -1 và cmd như F_GETFL?
flags = fcntl(-1,F_GETFL,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);
vì -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().
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()
và 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:
Plus (POSIX 2008) O_ACCMODE mà sau đó có thể được sử dụng để phân biệt O_RDONLY
, O_RDWR
và O_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ệ).
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;
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. –