Hướng dẫn fcntl python - trăn fcntl


Mô -đun này thực hiện điều khiển tệp và điều khiển I/O trên các mô tả tệp. Đây là một giao diện cho các thói quen fcntl()ioctl() UNIX. Để biết mô tả đầy đủ về các cuộc gọi này, xem các trang thủ công FCNTL (2) và IOCTL (2).

Tính khả dụng: Không phải emscripten, không phải wasi.: not Emscripten, not WASI.

Mô -đun này không hoạt động hoặc không có sẵn trên các nền tảng Webassugging wasm32-emscriptenwasm32-wasi. Xem các nền tảng Webassugging để biết thêm thông tin.WebAssembly platforms for more information.

Tất cả các chức năng trong mô -đun này lấy một mô tả tệp FD làm đối số đầu tiên của chúng. Đâ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 đối tượng io.IOBase, chẳng hạn như chính sys.stdin, cung cấp một fileno() trả về 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ăng

import struct, fcntl, os

f = open(...)
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)
0 nơi bây giờ chúng tăng
import struct, fcntl, os

f = open(...)
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)
1.Operations in this module used to raise an
import struct, fcntl, os

f = open(...)
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)
0 where they now raise an
import struct, fcntl, os

f = open(...)
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)
1.

Đã thay đổi trong phiên bản 3.8: Mô -đun FCNTL hiện chứa các hằng số

import struct, fcntl, os

f = open(...)
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)
2,
import struct, fcntl, os

f = open(...)
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)
3 và
import struct, fcntl, os

f = open(...)
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)
4 để niêm phong các mô tả tệp
import struct, fcntl, os

f = open(...)
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)
5.The fcntl module now contains
import struct, fcntl, os

f = open(...)
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)
2,
import struct, fcntl, os

f = open(...)
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)
3, and
import struct, fcntl, os

f = open(...)
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)
4 constants for sealing of
import struct, fcntl, os

f = open(...)
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)
5 file descriptors.

Đã thay đổi trong phiên bản 3.9: Trên macOS, mô -đun FCNTL hiển thị hằng số

import struct, fcntl, os

f = open(...)
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)
6, có được đườ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ố
import struct, fcntl, os

f = open(...)
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)
7,
import struct, fcntl, os

f = open(...)
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)
8 và
import struct, fcntl, os

f = open(...)
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)
9, được sử dụng khi làm việc với các khóa mô tả tệp mở.On macOS, the fcntl module exposes the
import struct, fcntl, os

f = open(...)
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)
6 constant, which obtains the path of a file from a file descriptor. On Linux(>=3.15), the fcntl module exposes the
import struct, fcntl, os

f = open(...)
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)
7,
import struct, fcntl, os

f = open(...)
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)
8 and
import struct, fcntl, os

f = open(...)
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)
9 constants, which are used when working with open file description locks.

Đã 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ố fcntl()0 và fcntl()1, cho phép kiểm tra và sửa đổi kích thước đường ống tương ứng.On Linux >= 2.6.11, the fcntl module exposes the fcntl()0 and fcntl()1 constants, which allow to check and modify a pipe’s size respectively.

Đã thay đổi trong phiên bản 3.11: Trên FreeBSD, mô -đun FCNTL hiển thị các hằng số fcntl()2 và fcntl()3, cho phép sao chép một bộ mô tả tệp, ngoài ra cài đặt sau fcntl()4.On FreeBSD, the fcntl module exposes the fcntl()2 and fcntl()3 constants, which allow to duplicate a file descriptor, the latter setting fcntl()4 flag in addition.

Mô -đun xác định các chức năng sau:

fcntl.fcntl (fd, cmd, arg = 0) ¶fcntl(fd, cmd, arg=0)

Thực hiện thao tác CMD trên FILE DESCRIPTOR FD (các đố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()6, 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à một giá trị số nguyên hoặc đối tượng fcntl()7. Với giá trị số nguyên, giá trị trả về của hàm này là giá trị trả về số nguyên của cuộc gọi C fcntl(). Khi đối số là byte, nó đại diện cho một cấu trúc nhị phân, ví dụ: Được tạo bởi fcntl()9. Dữ liệu nhị phân được sao chép vào bộ đệm có địa chỉ được chuyển đến cuộc gọi C fcntl(). Giá trị trả về sau một cuộc gọi thành công là nội dung của bộ đệm, được chuyển đổi thành đối tượng fcntl()7. Độ dài của đối tượng được trả về sẽ giống như độ dài của đối số Arg. Điều này được giới hạn ở 1024 byte. Nếu thông tin được trả về trong bộ đệm bởi hệ điều hành lớn hơn 1024 byte, điều này rất có thể dẫn đến vi phạm phân đoạn hoặc tham nhũng dữ liệu tinh tế hơn.

Nếu fcntl() thất bại, một

import struct, fcntl, os

f = open(...)
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)
1 sẽ được nâng lên.

Tăng một sự kiện kiểm toán ioctl()4 với các đối số ioctl()5, ioctl()6, ioctl()7.auditing event ioctl()4 with arguments ioctl()5, ioctl()6, ioctl()7.

fcntl.ioctl (fd, request, arg = 0, mutate_flag = true) ¶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ố yêu cầu được giới hạn ở các giá trị có thể phù hợp với 32 bit. Các hằng số quan tâm bổ sung để sử dụng làm đối số yêu cầu có thể được tìm thấy trong mô -đun ioctl()9, 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à một trong số số nguyên, một đối tượng hỗ trợ giao diện bộ đệm chỉ đọc (như fcntl()7) hoặc một đối tượng hỗ trợ giao diện bộ đệm đọc-viết (như wasm32-emscripten1).

Trong tất cả trừ trường hợp cuối cùng, hành vi là như đối với hàm fcntl().

Nếu một bộ đệm có thể thay đổi được truyền, thì hành vi được xác định bởi giá trị của tham số Mutate_flag.

Nếu nó là sai, khả năng đột biến của bộ đệm bị bỏ qua và hành vi cũng như bộ đệm chỉ đọc, ngoại trừ giới hạn byte 1024 được đề cập ở trên là tránh được-miễn là bộ đệm bạn vượt qua ít nhất là những gì hệ điều hành muốn Để đặt ở đó, mọi thứ nên hoạt động.

Nếu mutate_flag là đúng (mặc định), thì bộ đệm là (có hiệu lực) được chuyển cho cuộc gọi hệ thống ioctl() bên dưới, mã trả về sau này được chuyển trở lại cho Python gọi và bộ đệm Nội dung mới phản ánh hành động của ioctl(). Đây là một đơn giản hóa một chút, bởi vì nếu bộ đệm được cung cấp dài hơn 1024 byte, nó được sao chép vào bộ đệm tĩnh 1024 byte dài sau đó được chuyển sang ioctl() và được sao chép lại vào bộ đệm được cung cấp.

Nếu ioctl() thất bại, một ngoại lệ

import struct, fcntl, os

f = open(...)
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)
1 sẽ được nâng lên.

Một ví dụ:

>>> import array, 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
array('h', [13341])

Tăng một sự kiện kiểm toán wasm32-emscripten8 với các đối số ioctl()5, wasm32-wasi0, ioctl()7.auditing event wasm32-emscripten8 with arguments ioctl()5, wasm32-wasi0, ioctl()7.

fcntl.flock (fd, hoạt động) ¶flock(fd, operation)

Thực hiện thao tác khóa trên tệp mô tả tệp FD (các đối tượng tệp cung cấp phương thức fileno() cũng được chấp nhận). Xem đàn thủ công UNIX (2) để biết chi tiết. (Trên một số hệ thống, hàm này được mô phỏng bằng cách sử dụng fcntl().)

Nếu wasm32-wasi4 thất bại, một ngoại lệ

import struct, fcntl, os

f = open(...)
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)
1 sẽ được nâng lên.

Tăng một sự kiện kiểm toán wasm32-wasi6 với các đối số ioctl()5, wasm32-wasi8.auditing event wasm32-wasi6 with arguments ioctl()5, wasm32-wasi8.

fcntl.lockf (fd, cmd, len = 0, start = 0, whence = 0) ¶lockf(fd, cmd, len=0, start=0, whence=0)

Đây thực chất là một trình bao bọc xung quanh các cuộc gọi khóa fcntl(). FD là bộ mô tả tệp (đố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:

  • sys.stdin.fileno()1 - Mở khóa

  • sys.stdin.fileno()2 - có được khóa chia sẻ

  • sys.stdin.fileno()3 - có được khóa độc quyền

Khi CMD là sys.stdin.fileno()2 hoặc sys.stdin.fileno()3, nó cũng có thể được tạo ra bằng sys.stdin.fileno()6 để tránh chặn khi thu nhận khóa. Nếu sys.stdin.fileno()6 được sử dụng và khóa không thể có được,

import struct, fcntl, os

f = open(...)
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)
1 sẽ được nâng lên và ngoại lệ sẽ có thuộc tính ERRNO được đặt thành sys.stdin.fileno()9 hoặc io.IOBase0 (tùy thuộc vào hệ điều hành; để kiểm tra tính di động, hãy kiểm tra cả hai giá trị). Trên ít nhất một số hệ thống, sys.stdin.fileno()3 chỉ có thể được sử dụng nếu bộ mô tả tệp đề cập đến một tệp được mở để viết.

Len là số byte để khóa, bắt đầu là phần bù byte mà khóa bắt đầu, so với từ đâu và từ đâu như với io.IOBase2, cụ thể: cụ thể: cụ thể:

  • io.IOBase3 - Liên quan đến việc bắt đầu tệp (io.IOBase4)

  • io.IOBase5 - Liên quan đến vị trí bộ đệm hiện tại (io.IOBase6)

  • io.IOBase7 - Liên quan đến cuối tệp (io.IOBase8)

Mặc định cho bắt đầu là 0, có nghĩa là bắt đầu khi bắt đầu tệp. Mặc định cho LEN là 0 có nghĩa là khóa đến cuối tệp. Mặc định cho nơi cũng là 0.

Tăng một sự kiện kiểm toán io.IOBase9 với các đối số ioctl()5, ioctl()6, sys.stdin2, sys.stdin3, sys.stdin4.auditing event io.IOBase9 with arguments ioctl()5, ioctl()6, sys.stdin2, sys.stdin3, sys.stdin4.

Ví dụ (tất cả trên hệ thống tuân thủ SVR4):

import struct, fcntl, os

f = open(...)
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ữ giá trị số nguyên; Trong ví dụ thứ hai, nó sẽ giữ một đối tượng fcntl()7. Việc bố trí cấu trúc cho biến LockData phụ thuộc vào hệ thống-do đó sử dụng cuộc gọi wasm32-wasi4 có thể tốt hơn.