Tìm hiểu về Linux Command Open

Tóm tắc

#include << A HREF = "tệp: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "tệp: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "tập tin: /usr/include/fcntl.h"> fcntl.h> int mở (const char * pathname , int flags ); int mở (const char * pathname , int flags , chế độ mode_t ); int creat (const char * pathname , chế độ mode_t );

Sự miêu tả

Lệnh open linux của hệ thống open () được sử dụng để chuyển đổi một tên đường dẫn thành một bộ mô tả tệp (một số nguyên nhỏ, không âm để sử dụng trong I / O tiếp theo như với đọc , viết , v.v.). Khi cuộc gọi thành công, bộ mô tả tệp được trả về wil là bộ mô tả tệp thấp nhất hiện không mở cho quá trình. Cuộc gọi này tạo một tệp mở mới, không được chia sẻ với bất kỳ quá trình nào khác. (Nhưng các tập tin mở được chia sẻ có thể phát sinh thông qua cuộc gọi hệ thống (2).) Bộ mô tả tập tin mới được thiết lập để vẫn mở trên các hàm exec (xem fcntl (2)). Các tập tin bù đắp được thiết lập để bắt đầu của tập tin.

Cờ tham số là một trong O_RDONLY , O_WRONLY hoặc O_RDWR yêu cầu mở tệp chỉ đọc, chỉ ghi hoặc đọc / ghi, tương ứng, bitwise- hoặc 'd với 0 hoặc nhiều hơn sau đây:

O_CREAT

Nếu tập tin không tồn tại, nó sẽ được tạo. Chủ sở hữu (ID người dùng) của tệp được đặt thành ID người dùng hiệu quả của quy trình. Quyền sở hữu nhóm (ID nhóm) được đặt thành ID nhóm hiệu quả của quy trình hoặc ID nhóm của thư mục mẹ (tùy thuộc vào loại hệ thống tệp và tùy chọn gắn kết và chế độ của thư mục mẹ, xem, ví dụ: gắn kết tùy chọn bsdgroupssysvgroups của hệ thống tệp ext2, như được mô tả trong núi (8)).

O_EXCL

Khi được sử dụng với O_CREAT , nếu tệp đã tồn tại thì đó là lỗi và mở sẽ không thành công. Trong bối cảnh này, một liên kết tượng trưng tồn tại, bất kể nó trỏ đến đâu. O_EXCL bị hỏng trên các hệ thống tệp NFS , các chương trình dựa vào nó để thực hiện các tác vụ khóa sẽ chứa một điều kiện chủng tộc. Giải pháp để thực hiện khóa tệp nguyên tử bằng cách sử dụng tệp khóa là tạo tệp duy nhất trên cùng một fs (ví dụ: kết hợp tên máy chủ và pid), sử dụng liên kết (2) để tạo liên kết tới tệp khóa. Nếu liên kết () trả về 0, khóa sẽ thành công. Nếu không, hãy sử dụng stat (2) trên tệp duy nhất để kiểm tra xem số lượng liên kết của nó có tăng lên đến 2 hay không, trong trường hợp đó, khóa cũng thành công.

O_NOCTTY

Nếu tên đường dẫn đề cập đến một thiết bị đầu cuối --- xem tty (4) --- nó sẽ không trở thành thiết bị đầu cuối điều khiển của quá trình ngay cả khi quá trình này không có.

O_TRUNC

Nếu tập tin đã tồn tại và là một tập tin thông thường và chế độ mở cho phép viết (tức là, là O_RDWR hoặc O_WRONLY) nó sẽ bị cắt ngắn đến chiều dài 0. Nếu tệp là tệp FIFO hoặc thiết bị đầu cuối, cờ O_TRUNC bị bỏ qua. Nếu không, hiệu ứng của O_TRUNC không được chỉ định. (Trên nhiều phiên bản Linux, nó sẽ bị bỏ qua; trên các phiên bản khác, nó sẽ trả về lỗi.)

O_APPEND

Tệp được mở ở chế độ nối thêm. Trước mỗi lần ghi , con trỏ tập tin được đặt ở cuối tập tin, như thể với lseek . O_APPEND có thể dẫn đến các tệp bị hỏng trên các hệ thống tệp NFS nếu có nhiều quá trình nối dữ liệu vào một tệp cùng một lúc. Điều này là do NFS không hỗ trợ nối thêm vào một tệp, do đó hạt nhân khách phải mô phỏng nó, mà không thể thực hiện được nếu không có điều kiện chủng tộc.

O_NONBLOCK hoặc O_NDELAY

Khi có thể, tệp được mở ở chế độ không chặn. Cả việc mở cũng như bất kỳ thao tác tiếp theo nào trên bộ mô tả tệp được trả về sẽ làm cho quá trình gọi phải chờ. Để xử lý FIFO (tên đường ống), xem thêm nămo (4). Chế độ này không cần có bất kỳ tác dụng nào trên các tệp khác với FIFO.

O_SYNC

Tệp được mở cho I / O đồng bộ. Bất kỳ ghi nào trên bộ mô tả tập tin kết quả sẽ chặn quá trình gọi cho đến khi dữ liệu đã được ghi vào phần cứng cơ bản. Xem RESTRICTIONS bên dưới.

O_NOFOLLOW

Nếu tên đường dẫn là một liên kết tượng trưng, ​​thì mở không thành công. Đây là một phần mở rộng FreeBSD, được thêm vào Linux trong phiên bản 2.1.126. Các liên kết tượng trưng trong các thành phần trước đó của tên đường dẫn sẽ vẫn được theo sau. Các tiêu đề từ glibc 2.0.100 và sau đó bao gồm một định nghĩa của lá cờ này; hạt nhân trước 2.1.126 sẽ bỏ qua nếu sử dụng .

O_DIRECTORY

Nếu tên đường dẫn không phải là một thư mục, làm cho mở không thành công. Cờ này là đặc trưng cho Linux và được thêm vào phiên bản hạt nhân 2.1.126, để tránh các vấn đề từ chối dịch vụ nếu opendir (3) được gọi trên thiết bị FIFO hoặc băng, nhưng không được sử dụng bên ngoài việc triển khai opendir .

O_DIRECT

Cố gắng giảm thiểu hiệu ứng bộ nhớ cache của I / O đến và từ tệp này. Nói chung điều này sẽ làm giảm hiệu suất, nhưng nó rất hữu ích trong các tình huống đặc biệt, chẳng hạn như khi các ứng dụng làm bộ nhớ đệm của riêng chúng. File I / O được thực hiện trực tiếp đến / từ bộ đệm không gian của người dùng. I / O là đồng bộ, tức là, khi kết thúc cuộc gọi hệ thống đọc (2) hoặc ghi (2), dữ liệu được đảm bảo đã được chuyển. Các kích cỡ truyền, và sự liên kết của bộ đệm người dùng và bù đắp tệp phải là bội số của kích thước khối lôgic của hệ thống tệp.
Cờ này được hỗ trợ trên một số hệ thống giống Unix; hỗ trợ đã được thêm vào dưới Linux trong phiên bản hạt nhân 2.4.10.
Một giao diện ngữ nghĩa tương tự cho các thiết bị khối được mô tả trong nguyên (8).

O_ASYNC

Tạo ra một tín hiệu (SIGIO theo mặc định, nhưng điều này có thể được thay đổi thông qua fcntl (2)) khi đầu vào hoặc đầu ra trở thành có thể trên bộ mô tả tập tin này. Tính năng này chỉ khả dụng cho các thiết bị đầu cuối, đầu cực giả và ổ cắm. Xem fcntl (2) để biết thêm chi tiết.

O_LARGEFILE

Trên các hệ thống 32 bit hỗ trợ Hệ thống tệp lớn, cho phép các tệp có kích thước không thể được biểu diễn trong 31 bit sẽ được mở.

Một số cờ tùy chọn có thể được thay đổi bằng cách sử dụng fcntl sau khi tệp đã được mở.

Chế độ đối số chỉ định các quyền sử dụng trong trường hợp tệp mới được tạo. Nó được sửa đổi bởi umask của quá trình theo cách thông thường: các quyền của tập tin được tạo ra là (chế độ & ~ umask) . Lưu ý rằng chế độ này chỉ áp dụng cho các lần truy cập trong tương lai của tệp mới được tạo ra; cuộc gọi mở tạo ra một tệp chỉ đọc có thể trả về một bộ mô tả tệp đọc / ghi.

Các hằng số ký hiệu sau được cung cấp cho chế độ :

S_IRWXU

00700 người dùng (chủ sở hữu tệp) đã đọc, ghi và thực thi quyền

S_IRUSR (S_IREAD)

00400 người dùng đã đọc quyền

S_IWUSR (S_IWRITE)

00200 người dùng có quyền ghi

S_IXUSR (S_IEXEC)

Người dùng 00100 có quyền thực thi

S_IRWXG

00070 nhóm đã đọc, viết và thực thi quyền

S_IRGRP

Nhóm 00040 đã đọc quyền

S_IWGRP

Nhóm 00020 có quyền ghi

S_IXGRP

Nhóm 00010 có quyền thực thi

S_IRWXO

00007 người khác đã đọc, viết và thực thi quyền

S_IROTH

00004 người khác đã đọc quyền

S_IWOTH

00002 người khác có quyền ghi

S_IXOTH

00001 người khác có quyền thực thi

chế độ phải được chỉ định khi O_CREAT ở trong cờ và bị bỏ qua nếu không.

tạo tương đương với mở với cờ bằng O_CREAT | O_WRONLY | O_TRUNC .

GIÁ TRỊ TRẢ LẠI

mởtạo trả về bộ mô tả tập tin mới, hoặc -1 nếu xảy ra lỗi (trong trường hợp này, errno được đặt thích hợp). Lưu ý rằng mở có thể mở các tệp đặc biệt của thiết bị, nhưng tạo không thể tạo chúng - hãy sử dụng mknod (2) để thay thế.

Trên các hệ thống tệp NFS với ánh xạ UID được bật, mở có thể trả về một bộ mô tả tệp nhưng ví dụ như các yêu cầu đọc (2) bị từ chối bằng EACCES . Điều này là do máy khách thực hiện mở bằng cách kiểm tra các điều khoản, nhưng ánh xạ UID được thực hiện bởi máy chủ khi yêu cầu đọc và ghi.

Nếu tệp mới được tạo, các trường thời gian atime, ctime, mtime được đặt thành thời gian hiện tại và các trường ctime và mtime của thư mục cha. Nếu không, nếu tập tin được sửa đổi vì cờ O_TRUNC, các trường ctime và mtime của nó được đặt thành thời gian hiện tại.

Lỗi

EEXIST

tên đường dẫn đã tồn tại và O_CREATO_EXCL đã được sử dụng.

EISDIR

pathname đề cập đến một thư mục và truy cập được yêu cầu liên quan đến viết (có nghĩa là, O_WRONLY hoặc O_RDWR được thiết lập).

EACCES

Không được phép truy cập vào tệp được yêu cầu hoặc một trong các thư mục trong tên đường dẫn không cho phép quyền tìm kiếm (thực thi) hoặc tệp không tồn tại và ghi quyền truy cập vào thư mục chính không được phép.

ENAMETOOLONG

tên đường dẫn quá dài.

ENOENT

O_CREAT chưa được đặt và tệp được đặt tên không tồn tại. Hoặc, một thành phần thư mục trong tên đường dẫn không tồn tại hoặc là một liên kết tượng trưng lơ lửng.

ENOTDIR

Một thành phần được sử dụng như một thư mục trong tên đường dẫn không phải là, trên thực tế, một thư mục, hoặc O_DIRECTORY đã được chỉ định và tên đường dẫn không phải là một thư mục.

ENXIO

O_NONBLOCK | O_WRONLY được thiết lập, tệp được đặt tên là một FIFO và không có quá trình nào có tệp mở để đọc. Hoặc, tệp là một tệp đặc biệt của thiết bị và không có thiết bị tương ứng nào tồn tại.

ENODEV

pathname đề cập đến một tệp đặc biệt của thiết bị và không có thiết bị tương ứng nào tồn tại. (Đây là lỗi hạt nhân Linux - trong trường hợp này ENXIO phải được trả lại.)

EROFS

pathname đề cập đến một tệp trên hệ thống tệp chỉ đọc và đã yêu cầu ghi.

ETXTBSY

pathname đề cập đến một hình ảnh thực thi hiện đang được thực thi và quyền truy cập ghi được yêu cầu.

EFAULT

pathname trỏ ra ngoài vùng địa chỉ có thể truy cập của bạn.

ELOOP

Quá nhiều liên kết tượng trưng đã gặp phải trong việc giải quyết tên đường dẫn hoặc O_NOFOLLOW được chỉ định nhưng tên đường dẫn là một liên kết tượng trưng.

ENOSPC

tên đường dẫn đã được tạo nhưng thiết bị chứa tên đường dẫn không có chỗ cho tệp mới.

ENOMEM

Không có đủ bộ nhớ hạt nhân.

EMFILE

Quá trình đã có số tệp mở tối đa.

ENFILE

Đã đạt đến giới hạn trên tổng số tệp đã mở trên hệ thống.

Phù hợp với

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Cờ O_NOFOLLOWO_DIRECTORY là đặc trưng của Linux . Người ta có thể phải xác định macro _GNU_SOURCE để nhận định nghĩa của chúng.

Hạn chế

Có rất nhiều sự thiếu thông tin trong giao thức bên dưới NFS, ảnh hưởng đến những người khác O_SYNCO_NDELAY .

POSIX cung cấp ba biến thể khác nhau của I / O đồng bộ, tương ứng với các cờ O_SYNC , O_DSYNCO_RSYNC . Hiện tại (2.1.130) tất cả đều đồng nghĩa với Linux.