UNIX是什么,Unix文件操作

 2023-10-18 阅读 26 评论 0

摘要:Unix文件操作常用函數包括open、close、creat、lseek、dup、dup2、fcntl等,其中open、creat、fcntl函數需要包含頭文件<fcntl.h>,其余幾個函數需要包含頭文件<unistd.h>。由于在Linux操作系統中使用man命令可以非常方便的查找函數原型及示例,

Unix文件操作常用函數包括open、close、creat、lseek、dup、dup2、fcntl等,其中open、creat、fcntl函數需要包含頭文件<fcntl.h>,其余幾個函數需要包含頭文件<unistd.h>。由于在Linux操作系統中使用man命令可以非常方便的查找函數原型及示例,這里就不帖出函數原型了,只講一下使用時需要注意的地方。

?

每一個在程序中打開的文件都有一個相應的文件描述符(file descriptor),Unix操作系統中的文件描述符保存在/dev/fd目錄下。每一個進程對該目錄讀取到的結果都不想同(視該進程正在使用的文件數而定)。如果由open函數直接讀取該路徑下的文件,將視為在此進程中對該文件描述符所對應的文件進行dup操作,在大多數操作系統中將忽略打開方式,而部分操作系統要求打開方式為所涉及文件原先打開方式的子集。

UNIX是什么、當使用O_APPEND方式打開文件時,每次調用write函數會在文件最后面寫入新數據,調用write函數后讀取當前文件偏移量(current offset)可以很清楚的看到該值與文件最大偏移量相等。如果使用了O_RDWR | O_APPEND方式打開文件,程序可以對該文件在任意位置實現讀取操作(read),但寫入操作(write)會使文件偏移量被重置,如果讀取與寫入混合使用,可能會導致讀取位置出現偏差。

?

creat函數與

open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

等同,使用creat函數的缺陷在于如果需要在創建的同時讀寫該文件,需要在創建后將文件關閉,重新以讀寫方式open該文件,相對而言,下面的調用方式更為簡單:

open(pathname, O_RDWR | O_CREAT | O_TRUNC, mode);

如何定義和調用存儲過程的格式??

在lseek函數中,偏移量(offset)是一個長整型,可正可負。如果偏移量大于文件最大偏移量,對該位置進行寫入操作,將對文件進行擴展,文件中的空洞(從原文件最大偏移量到寫入位置)被填充為0,但并不占用磁盤塊。

例如:

fd = creat("file.txt", S_IRWXU);lseek(fd,102400,SEEK_SET);write(fd,"abcdefg",7);

程序執行后,使用"ls -ls file.txt"命令可以看出,文件file.txt所占塊數為8.

解壓縮程序可以生成的文件類型有、?

使用read函數時,遇到以下情況會使read函數提前返回:

  • 文件讀取遇到EOF。
  • 從終端中讀取到一行內容。
  • 當從網絡讀時,網絡中的緩沖機構可能造成返回值小于所要求讀的字節數。
  • 從管道或FIFO中讀取到全部內容。
  • 某些面向記錄的設備,例如磁帶,一次最多返回一個記錄。
  • 接收到中斷信號。

?

在進程中,一個進程所使用的所有文件描述符存放在一個table中,table中的每條記錄包括文件描述符falgs(file descriptor flags)和指向文件表的指針(fils pointer)。一個文件表包含一個文件的狀態標志(file status flags),當前偏移量(offset),一個指向v-node表的指針。一個v-node表包括v-node信息,i-node信息,文件大小等。如圖1所示:

UNIX/LINUX,?Unix文件進程中共享

圖1. Unix文件表(進程中)

在多個進程中,可能出現多個文件描述符指向同一個文件,此時如圖2所示:

Unix文件進程中共享2

圖2. 多個進程中同時打開同一個文件

當使用dup、dup2函數后,文件描述符將被復制,此時如圖3所示:

Unix文件進程中共享3

圖3. dup后多個文件描述符指向同一個file table

?

在進行多進程或多線程編程時,由于無法控制CPU對進程和線程的調度,如果不加以控制,可能會在任意兩條程序控制語句中間出現中斷,導致數據被污染。可以使用原語來保證在特定操作中數據不會被污染,使數據同步。原語形式的文件讀寫函數為pread和pwrite。也正因為數據可能被污染的原因,雖然dup2(file1,file2)與close(file2); fcntl(file1, F_DUPFD, file2)等價,但第一個函數不會導致數據被污染,我們應該使用第一個個函數。

?

在操作系統中,向文件中寫入數據往往只是暫時寫入至操作系統緩存中,由操作系統控制磁盤中文件的更新時間。使用sync、fsync、fdatasync函數可以實現磁盤中文件的實時更新。使用sync函數時,文件表中的所有文件將被更新。fsync函數只更新制定文件。fdatasync函數只更新指定文件中的數據內容,而不更新相應的文件屬性。

如果file status flags中O_SYNC標志被設置,程序中每次對該文件的write操作都將導致文件被更新;如果O_DSYNC被設置,程序中每次對該文件的write操作都將導致文件中的數據部分被更新。

?

fcntl函數可以修改已打開文件的屬性。當使用fcntl函數獲取文件狀態標記(file status flags)時,由于O_RDONLY、O_WRONLY、O_RDWR標記具有排外型,無法被直接識別,需要由O_ACCMODE掩碼轉換后才可以被識別。示例代碼如下:

#include <fcntl.h>
int
main(int argc, char *argv[])
{
int
val;
if (argc != 2)
err_quit("usage: a.out <descriptor#>");
if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
err_sys("fcntl error for fd %d", atoi(argv[1]));
switch (val & O_ACCMODE) {
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
err_dump("unknown access mode");
}
if (val & O_APPEND)
printf(", append");
if (val & O_NONBLOCK)
printf(", nonblocking");
#if defined(O_SYNC)
if (val & O_SYNC)
printf(", synchronous writes");
#endif
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)
if (val & O_FSYNC)
printf(", synchronous writes");
#endif
putchar('\n');
exit(0);
}

?

假設在shell中執行的腳本為,轉載于:https://www.cnblogs.com/pgx1030/archive/2012/04/30/2477109.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/148093.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息