fcntl --- Hệ thống fcntlioctl 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()ioctl(). Xem trang hướng dẫn sử dụng Unix fcntl(2)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_SEALSF_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_SETLKF_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_SZF_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_DUP2FDF_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ố FICLONEFICLONERANGE, 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_HINTRWH_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_SEALSF_GET_SEALS. Trên FreeBSD, mô-đun fcntl hiển thị các hằng số F_READAHEAD, F_ISUNIONSTACKF_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_GETNOSIGPIPEF_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ô-đun fcntl, 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 C fcntl(). 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ượng bytes. Độ 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, OSError sẽ đượ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.fcntl vớ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ống ioctl() 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ủa ioctl(). Đâ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 đến ioctl() 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ệ OSError sẽ 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.ioctl vớ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ằng fcntl().)

Nếu lệnh gọi flock() không thành công, một ngoại lệ OSError sẽ xuất hiện.

Tăng một auditing event fcntl.flock vớ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ức fileno() 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, OSError sẽ được nâng lên và ngoại lệ sẽ có thuộc tính errno được đặt thành EACCES hoặc EAGAIN (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_EX chỉ 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 whencewhence 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.lockf vớ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.

Xem thêm

Mô-đun os

Nếu cờ khóa O_SHLOCKO_EXLOCK có trong mô-đun os (chỉ trên BSD), thì hàm os.open() sẽ cung cấp một giải pháp thay thế cho các hàm lockf()flock().