Cuộc gọi hệ thống nào được sử dụng cho các tệp đang mở?

Cuộc gọi hệ thống nào được sử dụng cho các tệp đang mở?

Các cuộc gọi hệ thống tập tin



Cuộc gọi hệ thống. chương trình đưa ra yêu cầu đối với HĐH về một dịch vụ;
  • xem cuộc gọi hệ thống man 2
  • xem người đàn ông 2 mở
  • mở. cuộc gọi hệ thống để mở một tập tin
  • open trả về một bộ mô tả tệp, một số nguyên xác định vị trí của tệp đang mở này trong bảng các tệp đang mở cho quy trình hiện tại
  • sáng tạo. (không có 'e') lệnh gọi hệ thống để tạo tệp       /* không còn cần thiết */
  • gần. cuộc gọi hệ thống để đóng một tập tin
  • đọc. đọc dữ liệu từ một tệp được mở để đọc
  • viết. ghi dữ liệu vào một tệp được mở để ghi
  • tìm kiếm. tìm đến một vị trí xác định trong tệp (được sử dụng để truy cập ngẫu nhiên khi đọc hoặc ghi tệp)
    • cuộc gọi hệ thống tìm kiếm ban đầu đã sử dụng địa chỉ 16 bit
    • "lseek" được đặt tên vì nó sử dụng số nguyên "dài" làm địa chỉ để tìm kiếm. Trong thực tế, đây là số nguyên 32 bit trên hầu hết các máy hiện tại
    • các tổ chức tiêu chuẩn UNIX dường như chưa chuẩn hóa một lệnh gọi hệ thống tìm kiếm phù hợp cho các địa chỉ 64 bit
    • Hiện tại (tháng 1 năm 2005), lệnh gọi hệ thống llseek có sẵn trên Solaris (hercules), nhưng không có dấu hiệu nào cho thấy lệnh gọi hệ thống này là di động
    • Các phiên bản Linux dường như hỗ trợ _llseek() hoặc llseek() cho các thiết bị thô. Trình biên dịch có thể hỗ trợ lseek() khi chấp nhận độ dài 64 bit hoặc thêm lseek64(), theo tùy chọn thời gian biên dịch
open

SYNOPSIS 
     #include  
     #include  
     #include  

     int open (const char *path, int oflag); 

DESCRIPTION 
     path points to a path name naming a file.  open opens a file descriptor 
     for the named file and sets the file status flags according to the value 
     of oflag. 

    O_RDONLY 
            Open for reading only. 

     O_WRONLY 
            Open for writing only. 

     O_RDWR Open for reading and writing. 

read

SYNOPSIS 
     #include  
     ssize_t read(int fildes, void *buf, size_t nbyte); 

DESCRIPTION 
     read attempts to read nbyte bytes from the file associated with fildes 
     into the buffer pointed to by buf.  If nbyte is zero, read returns zero 
     and has no other results. 

write

SYNOPSIS 
     #include  
     ssize_t write(int fildes, const void *buf, size_t nbyte); 

DESCRIPTION 
     write attempts to write nbyte bytes from the buffer pointed to by buf to 
     the file associated with fildes.  If nbyte is zero and the file is a 
     regular file, write returns zero and has no other results.  fildes is a 
     file descriptor. 

close

SYNOPSIS 
     #include  
     int close(int fildes); 

DESCRIPTION 
     close closes the file descriptor indicated by fildes. 

stat

SYNOPSIS 
     #include  
     #include  

     int stat(const char *path, struct stat *buf); 

DESCRIPTION 
    stat obtains information about the named file. For more information, please read Section 2.8 in Interprocess Communications in UNIX:
The Nooks & Crannies. 

Trong C, bạn sử dụng các hàm thư viện fopen, fread, fwrite, fclose

  • con trỏ tệp => fp
  • fp = fopen("tệp của tôi. dat", "rb"); nói mở một tệp có tên myfile. dat để đọc dữ liệu nhị phân
  • fopen là chức năng thư viện 'C' gọi mở, lệnh gọi hệ thống thực sự trên UNIX
  • trên bất kỳ HĐH nào, việc triển khai thư viện fopen cuối cùng phải gọi lệnh gọi hệ thống cho HĐH đó. Cuộc gọi hệ thống có liên quan hầu như luôn được gọi là mở

mở cuộc gọi hệ thống

  • mở (đường dẫn, cờ, chế độ)
  • đường dẫn là một chức năng (i. e. /net/chia sẻ/vv)
  • cờ - xem người đàn ông 2 mở

Giá trị cờ ví dụ

  • O_RDONLY. chỉ đọc
  • O_RDWR. đọc và viết
  • O_APPEND. thêm vào tập tin
  • fd. bộ mô tả tập tin
  • int fd;
  • fd = mở ("tệp của tôi", O_RDONLY, 0755);
  • chế độ => rwxr-xr-x

Mở bảng mô tả tệp
  • bảng fd là một mảng
    • cho một tiến trình đang chạy
    • liên quan đến mọi quá trình
    • danh sách các tệp đang mở được lưu trữ trong bảng fd
    • mỗi mục tương ứng với một tệp đang mở
    • được sao chép khi fork được thực thi
  • e. g
    • mỗi quá trình có bảng riêng của mình
    • mở. thêm một mục vào bảng (tệp mới được tạo)
    • gần. xóa một mục từ bảng
    • đây là quy trình "bình thường", quy trình không có chuyển hướng i/o (không có nhánh)
    • fd # từ 0 đến 31
    
 0-   ___________    
      |	0	|  - stdin -- keyboard    
      |	1	|  - stdout -- screen    
      |	2	|  - stderr -- screen    
      |	3	|  - file 'A', closed, now a NULL value    
      |	4	|  - "myfile"    
      |	5	|    
      |	6	|    
      |	7	|    
      |		|    
      |	.	|    
      |	:	|    
   31-|	31	|    

fork => bản sao của bảng này đi cùng với quy trình mới


chuyển hướng

Trong UNIX shell (chương trình tiện ích csh), các ký hiệu '
printf -- luôn gửi đầu ra tới tệp/thiết bị được mô tả bởi mục #1 trong bảng fd
fprintf (stderr,. ) -- gửi đầu ra tới tệp/thiết bị được mô tả bởi mục #2
scanf, getchar -- lấy đầu vào từ tệp/thiết bị được mô tả bởi mục #0

  • mở một tệp để đọc thêm một mục vào vị trí trống tiếp theo trong bảng fd
  • nếu hai tệp được mở và tệp đầu tiên được đóng sau đó, NULL sẽ thay thế các tệp đó trong bảng fd
  • các mục nhập tệp khác trong bảng fd không di chuyển lên để lấp đầy khoảng trống
  • khi một tệp mới được mở, nó sẽ thay thế vị trí có sẵn đầu tiên (NULL) trong bảng mô tả tệp

fd = mở (); . );


Để chuyển hướng đầu vào

  • sao chép fd từ mục #4 sang mục #0       /* stdin luôn tương ứng với mục #0 */
  • lệnh sao chép được gọi là dup2       /* lệnh gọi hệ thống */
  • cách sử dụng. dup2 (từ vị trí #, đến vị trí #)

    e. g. dup2(4, 0);

    • bây giờ chúng tôi có 2 fds cho cùng một tệp (tôi. e. #0 & #4)
    • chính sách tiêu chuẩn là xóa một -- close (file_fd);
    • chúng tôi làm điều này sau khi dup2
    • chúng tôi không muốn 2 bộ mô tả tệp cho cùng một tệp
    • với dup2 được thực thi, giờ đây chúng tôi đã vĩnh viễn mất khả năng đọc từ bàn phím
    • Csh luôn giữ các bản sao của vị trí #0, #1 & #2 và khôi phục chúng khi sử dụng lệnh dup2
    e. g. % một. ra > đầu ra
    • cuộc gọi hệ thống kép. fd2 = dup(fd 1)
    • sao chép mục nhập từ vị trí fd #1 vào vị trí trống đầu tiên trong bảng fd
    • vị trí này được trả lại cho fd2
    • chúng ta có thể sử dụng điều này để lưu trữ fd #0, #1 & #2 trước khi sao chép (thực thi dup2) để sau này bạn có thể khôi phục chúng

  • Chuyển hướng đầu ra e. g. %một. out > outfile_______2

    phát bóng. Chương trình hệ thống UNIX in ra một tệp, sau đó in ra tệp thứ hai

    Cuộc gọi hệ thống nào được sử dụng cho các tệp đang mở?
    Cuộc gọi hệ thống nào được sử dụng cho các tệp đang mở?

    Cuộc gọi hệ thống nào được sử dụng cho các tệp đang mở?
    Mục lục

    Cuộc gọi hệ thống nào được sử dụng để đóng tệp?

    A đóng lệnh gọi hệ thống là lệnh gọi hệ thống được hạt nhân sử dụng để đóng một bộ mô tả tệp. Đối với hầu hết các hệ thống tệp, một chương trình chấm dứt quyền truy cập vào một tệp trong hệ thống tệp bằng lệnh gọi hệ thống đóng.

    Cuộc gọi hệ thống nào được mở để mở hoặc tạo tệp?

    Lệnh gọi hệ thống nào sau đây được sử dụng để mở hoặc tạo tệp? . Để đọc hoặc ghi vào một tệp, trước tiên chúng ta cần mở nó. Với mục đích này, cuộc gọi hệ thống mở được sử dụng. Mở có hai hình thức; .

    cuộc gọi hệ thống open() trả về điều gì?

    Cho một tên đường dẫn cho một tệp, open() trả về một bộ mô tả tệp , một số nguyên nhỏ, không âm để sử dụng trong hệ thống tiếp theo . ). Bộ mô tả tệp được trả về bởi một cuộc gọi thành công sẽ là bộ mô tả tệp được đánh số thấp nhất hiện không mở cho quy trình.

    Cuộc gọi hệ thống nào được sử dụng để tạo tệp?

    Về cơ bản có tổng cộng 5 loại lệnh gọi hệ thống I/O. 1. Tạo . Được sử dụng để tạo một tệp trống mới.