fcntl --- Hệ thống fcntl và ioctl gọi¶
Mô-đun này thực hiện điều khiển tệp và I/O trên các bộ mô tả tệp. Nó là một giao diện cho các quy trình Unix fcntl() và ioctl(). Xem trang hướng dẫn sử dụng Unix fcntl(2) và ioctl(2) để biết đầy đủ chi tiết.
sẵn có: Unix, not WASI.
Tất cả các hàm trong mô-đun này đều lấy bộ mô tả tệp fd làm đối số đầu tiên. Đây có thể là một bộ mô tả tệp số nguyên, chẳng hạn như được trả về bởi sys.stdin.fileno() hoặc một đối tượng io.IOBase, chẳng hạn như chính sys.stdin, cung cấp một fileno() trả về một bộ mô tả tệp chính hãng.
Thay đổi trong phiên bản 3.3: Các hoạt động trong mô-đun này được sử dụng để tạo IOError, nơi hiện tại chúng tạo ra OSError.
Thay đổi trong phiên bản 3.8: Mô-đun fcntl hiện chứa các hằng số F_ADD_SEALS, F_GET_SEALS và F_SEAL_* để niêm phong các bộ mô tả tệp os.memfd_create().
Thay đổi trong phiên bản 3.9: Trên macOS, mô-đun fcntl hiển thị hằng số F_GETPATH, hằng số này lấy đường dẫn của tệp từ bộ mô tả tệp. Trên Linux (>=3,15), mô-đun fcntl hiển thị các hằng số F_OFD_GETLK, F_OFD_SETLK và F_OFD_SETLKW, được sử dụng khi làm việc với các khóa mô tả tệp đang mở.
Thay đổi trong phiên bản 3.10: Trên Linux >= 2.6.11, mô-đun fcntl hiển thị các hằng số F_GETPIPE_SZ và F_SETPIPE_SZ, cho phép kiểm tra và sửa đổi kích thước của ống tương ứng.
Thay đổi trong phiên bản 3.11: Trên FreeBSD, mô-đun fcntl hiển thị các hằng số F_DUP2FD và F_DUP2FD_CLOEXEC, cho phép sao chép bộ mô tả tệp, ngoài ra còn có cờ FD_CLOEXEC cài đặt sau.
Thay đổi trong phiên bản 3.12: Trên Linux >= 4.5, mô-đun fcntl hiển thị các hằng số FICLONE và FICLONERANGE, cho phép chia sẻ một số dữ liệu của một tệp với một tệp khác bằng cách liên kết lại trên một số hệ thống tệp (ví dụ: btrfs, OCFS2 và XFS). Hành vi này thường được gọi là "copy-on-write".
Thay đổi trong phiên bản 3.13: Trên Linux >= 2.6.32, mô-đun fcntl hiển thị các hằng số F_GETOWN_EX, F_SETOWN_EX, F_OWNER_TID, F_OWNER_PID, F_OWNER_PGRP, cho phép chuyển các tín hiệu khả dụng I/O tới một luồng, quy trình hoặc nhóm quy trình cụ thể. Trên Linux >= 4.13, mô-đun fcntl hiển thị các hằng số F_GET_RW_HINT, F_SET_RW_HINT, F_GET_FILE_RW_HINT, F_SET_FILE_RW_HINT và RWH_WRITE_LIFE_*, cho phép thông báo cho kernel về thời gian tồn tại dự kiến tương đối của việc ghi trên một nút nhất định hoặc thông qua một mô tả tệp mở cụ thể. Trên Linux >= 5.1 và NetBSD, mô-đun fcntl hiển thị hằng số F_SEAL_FUTURE_WRITE để sử dụng với các hoạt động F_ADD_SEALS và F_GET_SEALS. Trên FreeBSD, mô-đun fcntl hiển thị các hằng số F_READAHEAD, F_ISUNIONSTACK và F_KINFO. Trên macOS và FreeBSD, mô-đun fcntl hiển thị hằng số F_RDAHEAD. Trên NetBSD và AIX, mô-đun fcntl hiển thị hằng số F_CLOSEM. Trên NetBSD, mô-đun fcntl hiển thị hằng số F_MAXFD. Trên macOS và NetBSD, mô-đun fcntl hiển thị hằng số F_GETNOSIGPIPE và F_SETNOSIGPIPE.
Thay đổi trong phiên bản 3.14: Trên Linux >= 6.1, mô-đun fcntl hiển thị F_DUPFD_QUERY để truy vấn bộ mô tả tệp trỏ đến cùng một tệp.
Mô-đun xác định các chức năng sau:
- fcntl.fcntl(fd, cmd, arg=0, /)¶
Thực hiện thao tác cmd trên bộ mô tả tệp fd (đối tượng tệp cung cấp phương thức
fileno()cũng được chấp nhận). Các giá trị được sử dụng cho cmd phụ thuộc vào hệ điều hành và có sẵn dưới dạng hằng số trong mô-đunfcntl, sử dụng cùng tên như được sử dụng trong các tệp tiêu đề C có liên quan. Đối số arg có thể là giá trị số nguyên, bytes-like object hoặc một chuỗi. Loại và kích thước của arg phải khớp với loại và kích thước đối số của thao tác như được chỉ định trong tài liệu C có liên quan.Khi arg là số nguyên, hàm trả về giá trị trả về số nguyên của lệnh gọi C
fcntl().Khi đối số là đối tượng giống byte, nó biểu thị một cấu trúc nhị phân, chẳng hạn như được tạo bởi
struct.pack(). Giá trị chuỗi được mã hóa thành nhị phân bằng mã hóa UTF-8. Dữ liệu nhị phân được sao chép vào bộ đệm có địa chỉ được chuyển tới lệnh gọi Cfcntl(). Giá trị trả về sau khi gọi thành công là nội dung của bộ đệm, được chuyển đổi thành đối tượngbytes. Độ dài của đối tượng được trả về sẽ bằng độ dài của đối số arg. Điều này được giới hạn ở 1024 byte.Nếu lệnh gọi
fcntl()không thành công,OSErrorsẽ được đưa ra.Ghi chú
Nếu loại hoặc kích thước của arg không khớp với loại hoặc kích thước đối số của thao tác (ví dụ: nếu một số nguyên được truyền khi một con trỏ được mong đợi hoặc thông tin được hệ điều hành trả về trong bộ đệm lớn hơn 1024 byte), thì điều này rất có thể dẫn đến vi phạm phân đoạn hoặc hỏng dữ liệu tinh vi hơn.
Tăng một auditing event
fcntl.fcntlvới các đối sốfd,cmd,arg.Thay đổi trong phiên bản 3.14: Thêm hỗ trợ bytes-like objects tùy ý, không chỉ
bytes.
- fcntl.ioctl(fd, request, arg=0, mutate_flag=True, /)¶
Hàm này giống hệt với hàm
fcntl(), ngoại trừ việc xử lý đối số thậm chí còn phức tạp hơn.Tham số request được giới hạn ở các giá trị có thể vừa với 32 bit hoặc 64 bit, tùy thuộc vào nền tảng. Các hằng số quan tâm bổ sung để sử dụng làm đối số request có thể được tìm thấy trong mô-đun
termios, dưới cùng tên như được sử dụng trong các tệp tiêu đề C có liên quan.Tham số arg có thể là số nguyên, bytes-like object hoặc một chuỗi. Loại và kích thước của arg phải khớp với loại và kích thước đối số của thao tác như được chỉ định trong tài liệu C có liên quan.
Nếu arg không hỗ trợ giao diện bộ đệm đọc-ghi hoặc mutate_flag sai thì hoạt động cũng giống như đối với chức năng
fcntl().Nếu arg hỗ trợ giao diện bộ đệm đọc-ghi (như
bytearray) và mutate_flag là đúng (mặc định), thì bộ đệm (trên thực tế) được chuyển đến lệnh gọi hệ thốngioctl()cơ bản, mã trả về của lệnh sau sẽ được chuyển trở lại Python đang gọi và nội dung mới của bộ đệm phản ánh hành động củaioctl(). Đây là một sự đơn giản hóa một chút, bởi vì nếu bộ đệm được cung cấp có độ dài nhỏ hơn 1024 byte thì trước tiên nó sẽ được sao chép vào bộ đệm tĩnh dài 1024 byte, sau đó được chuyển đếnioctl()và sao chép lại vào bộ đệm được cung cấp.Nếu lệnh gọi
ioctl()không thành công, một ngoại lệOSErrorsẽ xuất hiện.Ghi chú
Nếu loại hoặc kích thước của arg không khớp với loại hoặc kích thước đối số của thao tác (ví dụ: nếu một số nguyên được truyền khi một con trỏ được mong đợi hoặc thông tin được hệ điều hành trả về trong bộ đệm lớn hơn 1024 byte hoặc kích thước của đối tượng giống như byte có thể thay đổi quá nhỏ), thì điều này rất có thể dẫn đến vi phạm phân đoạn hoặc hỏng dữ liệu tinh vi hơn.
Một ví dụ:
>>> nhập mảng, fcntl, struct, termios, os >>> os.getpgrp() 13341 >>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, " "))[0] 13341 >>> buf = array.array('h', [0]) >>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1) 0 >>> buf mảng('h', [13341])
Tăng một auditing event
fcntl.ioctlvới các đối sốfd,request,arg.Thay đổi trong phiên bản 3.14: Zz000zz luôn được giải phóng trong cuộc gọi hệ thống. Cuộc gọi hệ thống không thành công với EINTR sẽ tự động được thử lại.
- fcntl.flock(fd, operation, /)¶
Thực hiện thao tác khóa operation trên bộ mô tả tệp fd (đối tượng tệp cung cấp phương thức
fileno()cũng được chấp nhận). Xem hướng dẫn sử dụng Unix flock(2) để biết chi tiết. (Trên một số hệ thống, chức năng này được mô phỏng bằngfcntl().)Nếu lệnh gọi
flock()không thành công, một ngoại lệOSErrorsẽ xuất hiện.Tăng một auditing event
fcntl.flockvới các đối sốfd,operation.
- fcntl.lockf(fd, cmd, len=0, start=0, whence=0, /)¶
Về cơ bản, đây là một trình bao bọc xung quanh các lệnh gọi khóa
fcntl(). fd là bộ mô tả tệp (các đối tượng tệp cung cấp phương thứcfileno()cũng được chấp nhận) của tệp để khóa hoặc mở khóa và cmd là một trong các giá trị sau:- fcntl.LOCK_UN¶
Phát hành một khóa hiện có.
- fcntl.LOCK_SH¶
Có được một khóa chia sẻ.
- fcntl.LOCK_EX¶
Có được một khóa độc quyền.
- fcntl.LOCK_NB¶
Bitwise HOẶC với bất kỳ hằng số nào trong ba hằng số
LOCK_*khác để thực hiện yêu cầu không bị chặn.
Nếu
LOCK_NBđược sử dụng và không thể lấy được khóa,OSErrorsẽ được nâng lên và ngoại lệ sẽ có thuộc tính errno được đặt thànhEACCEShoặcEAGAIN(tùy thuộc vào hệ điều hành; để biết tính di động, hãy kiểm tra cả hai giá trị). Trên ít nhất một số hệ thống,LOCK_EXchỉ có thể được sử dụng nếu bộ mô tả tệp đề cập đến một tệp được mở để ghi.len là số byte cần khóa, start là độ lệch byte tại đó khóa bắt đầu, liên quan đến whence và whence giống như với
io.IOBase.seek(), cụ thể:0-- liên quan đến phần đầu của tập tin (os.SEEK_SET)1- liên quan đến vị trí bộ đệm hiện tại (os.SEEK_CUR)2-- liên quan đến phần cuối của tập tin (os.SEEK_END)
Mặc định cho start là 0, nghĩa là bắt đầu ở đầu tệp. Mặc định cho len là 0 có nghĩa là khóa đến cuối file. Mặc định cho whence cũng là 0.
Tăng một auditing event
fcntl.lockfvới các đối sốfd,cmd,len,start,whence.
Ví dụ (tất cả đều trên hệ thống tuân thủ SVR4):
nhập cấu trúc, fcntl, os
f = mở(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)
lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
Lưu ý rằng trong ví dụ đầu tiên, biến giá trị trả về rv sẽ giữ một giá trị nguyên; trong ví dụ thứ hai, nó sẽ chứa một đối tượng bytes. Bố cục cấu trúc cho biến lockdata phụ thuộc vào hệ thống --- do đó sử dụng lệnh gọi flock() có thể tốt hơn.