Ⅰ 如何自己編程實現linux中的read()、write()函數
首先你要說明白,你是要實現的是文件的讀寫還是網路上的數據傳輸?
然後呢,要說的是無論是網路還是文件的讀寫,這兩函數都已經需要syscall到內核來實現了。。。
最後呢,想要自己搞得編寫相應的IO操作驅動(我是不會的了),或者直接用syscall函數調系統服務,單純的C語言可能無法實現。
Ⅱ linux下 用fcnl.h頭文件中的文件讀寫函數, 怎麼把1-100的字元串寫到一個文件中,且每
open(打開文件)
相關函數 read,write,fcntl,close,link,stat,umask,unlink,fopen
表頭文件 #include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定義函數 int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
函數說明 參數pathname 指向欲打開的文件路徑字元串。下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。
O_CREAT 若欲打開的文件不存在則自動建立該文件。
O_EXCL 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,並且欲打開的文件為符號連接,則會打開文件失敗。
O_NOCTTY 如果欲打開的文件為終端機設備時,則不會將該終端機當成進程式控制制終端機。
O_TRUNC 若文件存在並且以可寫的方式打開時,此旗標會令文件長度清為0,而原來存於該文件的資料也會消失。
O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件後面。
O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打開文件。
O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接,則會令打開文件失敗。
O_DIRECTORY 如果參數pathname 所指的文件並非為一目錄,則會令打開文件失敗。
此為Linux2.2以後特有的旗標,以避免一些系統安全問題。參數mode 則有下列數種組合,只有在建立新文件時才會生效,此外真正建文件時的許可權會受到umask值所影響,因此該文件許可權應該為(mode-umaks)。
S_IRWXU00700 許可權,代表該文件所有者具有可讀、可寫及可執行的許可權。
S_IRUSR 或S_IREAD,00400許可權,代表該文件所有者具有可讀取的許可權。
S_IWUSR 或S_IWRITE,00200 許可權,代表該文件所有者具有可寫入的許可權。
S_IXUSR 或S_IEXEC,00100 許可權,代表該文件所有者具有可執行的許可權。
S_IRWXG 00070許可權,代表該文件用戶組具有可讀、可寫及可執行的許可權。
S_IRGRP 00040 許可權,代表該文件用戶組具有可讀的許可權。
S_IWGRP 00020許可權,代表該文件用戶組具有可寫入的許可權。
S_IXGRP 00010 許可權,代表該文件用戶組具有可執行的許可權。
S_IRWXO 00007許可權,代表其他用戶具有可讀、可寫及可執行的許可權。
S_IROTH 00004 許可權,代表其他用戶具有可讀的許可權
S_IWOTH 00002許可權,代表其他用戶具有可寫入的許可權。
S_IXOTH 00001 許可權,代表其他用戶具有可執行的許可權。
返回值 若所有欲核查的許可權都通過了檢查則返回0 值,表示成功,只要有一個許可權被禁止則返回-1。
錯誤代碼 EEXIST 參數pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標。
EACCESS 參數pathname所指的文件不符合所要求測試的許可權。
EROFS 欲測試寫入許可權的文件存在於只讀文件系統內。
EFAULT 參數pathname指針超出可存取內存空間。
EINVAL 參數mode 不正確。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname不是目錄。
ENOMEM 核心內存不足。
ELOOP 參數pathname有過多符號連接問題。
EIO I/O 存取錯誤。
附加說明 使用access()作用戶認證方面的判斷要特別小心,例如在access()後再作open()空文件可能會造成系統安全上的問題。
Ⅲ 關於linux的write函數
1.功能
將數據寫入已打開的文件內
2.相關函數
open,read,fcntl,close,lseek,sync,fsync,fwrite
3.表頭文件
#include
4.定義函數
ssize_t
write
(int
fd,const
void
*
buf,size_t
count);
5.函數說明
write()會把參數buf所指的內存寫入count個位元組到參數fd所指的文件內。當然,文件讀寫位置也會隨之移動。
6.返回值
如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤代碼存入errno中。
7.錯誤代碼
eintr
此調用被信號所中斷。
eagain
當使用不可阻斷i/o
時(o_nonblock),若無數據可讀取則返回此值。
ebadf
參數fd非有效的文件描述詞,或該文件已關閉。
Ⅳ linux下系統調用函數read()
open系統調用
open函數的三個參數:
(1)path是已經存在的文件的路徑;
(2)oflags參數:若值為 O_RDONLY ,就以只讀方式打開文件;
若值為 O_WDONLY,就以只寫方式打開文件;
若值為 O_RDWR,就以讀寫方式打開文件;
(3)參數mode:文件的許可權,對於一個已經存在的文件,參數mode是沒有用的,通常將其省略,因此這種情況下open調用只需兩個參數。
創建新文件:
前面已經說到,當文件不存在時,open會創建一個新文件(僅能是普通文件),我們只需要用 or操作向open的 oflags參數中加入標志O_CREAT即可。這樣可以創建一個新的只讀文件,但是這沒有任何意義,因為所創建的新文件沒有任何可讀內容。因此一般需要 O_CREAT與 O_WRONLY或 O_RDWR一起使用,此時就需要mode參數了。
例如:
int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)
參數mode僅在創建新文件時有效,對於一個已經存在的文件,它沒有任何作用。
關於open的flags參數:
除了以上介紹的 open標志外,open還有許多標志,具體的如下表所示:
標志
解釋
O_RDONLY
只讀方式打開
O_WRONLY
只寫方式打開
O_RDWR
讀寫方式打開
O_APPEND
每次寫都追加到文件的尾端
O_CREAT
若文件不存在則創建文件
O_DSYNC
設置同步I/O方式
O_EXCL
如果文件已存在,則出錯;必須與O_CREAT一起使用
O_NOCTTY
不將此設備作為控制終端
O_NONBLOCK
不等待命名管道或特殊文件准備好
O_RSYNC
設置同步I/O方式
O_SYNC
設置同步I/O方式
O_TRUNC
將其長度截短為0
write系統調用
write函數的三個參數:
(1)fildes: 文件描述符
(2)buf:指定寫入數據的數據緩沖區
(3)nbytes:指定寫入的位元組數
函數返回值:
成功:已寫的位元組數
-1 :出錯
0:未寫入任何數據
例子:
運行結果:
read系統調用
read函數的三個參數:
(1)fildes:文件描述符
(2)buf:指定讀入數據的數據緩沖區
(3)nbytes:指定讀入的位元組數
函數返回值:
成功:已讀的位元組數
0:未讀入任何數據
-1:出錯
例子:
運行結果:
close系統調用
通過對 close進行分析,我們會發現close並沒有做什麼實質工作,它沒有刷新任何內核緩沖區,而僅僅是使文件描述符可以重用。
Ⅳ linux lseek函數怎麼用
Linux的lseek函數用來控制一個打開的文件的讀寫位置,它的函數原型如下:
off_t lseek(int fildes,off_t offset ,int whence);
參數的用法:fildes參數為一個已打開的文件描述符;參數offset為讀寫位置的位移數,這個位移數是根據參數whence來確定的;whence參數分為下列三種:
SEEK_SET:表示offset用來直接設置讀寫位置。
SEEK_CUR:表示以目前的讀寫位置往後增加offset個位移量。
SEEK_END:表示將讀寫位置指向文件尾後再增加offset個位移量。
當whence值為SEEK_CUR或SEEK_END時,參數offet允許負值出現。當lseek調用成功時返回目前的讀寫位置,也就是距離文件開頭多少個位元組。若有錯誤則返回-1,errno會存放錯誤代碼。下面是幾個使用示例:
將讀寫位置移到文件開頭:lseek(myfile, 0, SEEK_SET);
將讀寫位置移到文件尾:lseek(myfile, 0, SEEK_END);
想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR);
注意:使用lseek函數需要包含以下頭文件:
#include <sys/types.h>
#include <unistd.h>
Ⅵ Linux C write函數
好隱蔽的一個錯誤!! if ((fd=open(pathname, FLAGS, MODE)==-1)) 這句,括弧的位置錯誤了
應該是: if ( (fd=open(pathname, FLAGS, MODE))==-1)
原寫法,導致fd值為0,成了標准輸入(終端)了,所以,lseek就會一直報錯!
Ⅶ linux求解:通過系統調用實現文件的讀寫,類似於庫函數的fprintf和fscanf
1.fscanf():從文件指針fp指向的文件中,按format中對應的控制格式讀取數據,並存儲在agars對應的變數中;
原型: fscanf(FILE *fp, const char *format, agars)
#include
#include
int main()
{
FILE *fp;
char ch;
fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("Open filefailure!");
exit(1);
}
else
{
fscanf(fp,"%s",&ch);
}
printf("%s\n",ch);
fclose(fp);
return 0;
}
註:對於上面else中的內容需注意一下幾點:
1.如果要讀取一個整數(該整數必須在所存變數的數據類型表示的范圍之內)則為:fscanf(fp, 「%d」, &ch),而此時ch應該定義為int;若讀取的數據大於int所能表示的范圍,則讀取的數據屏幕顯示為負數,即讀取的數據發生越界,如果此時的ch依然為char型,則運行時報錯(內存讀寫錯誤)。
2.如果要讀取字元串,則ch應該定義為char型數組或指針(指針需分配空間),而不能將其定義為char型,否則也會報錯(內存讀寫錯誤);
3.輸出數據時的數據格式應該和讀取數據時的控制格式相同,除非進行強制轉換。
4.使用fscanf()時,其中的變數agars應該取其地址;
5.對於文件的操作,記得文件打開操作後要關閉。
對於fscanf()主要應用在按行讀取一個文件中的所有內容或依次讀取每行相隔的幾個數據,具體參照以下示例:
#include
#include
int main()
{
FILE *fp;
char *ch, *ah;
ch =(char *) malloc(sizeof(char) * 100);
ah =(char *) malloc(sizeof(char) * 100);
fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("Open filefailure!");
exit(1);
}
else
{
while(!feof(fp))
{
fscanf(fp, 「%s」, ch);
printf(「%s」, ch);//這兩行為按行讀取所有數據
fscanf(fp, 「%s%s」, ch, ah);
printf(「The value of ch and ah is:%s %s\n」,ch,ah);//這兩行為分別讀取每行相隔的幾個數據
}
}
printf("%s\n",ch);
free(ch);
free(ah);
fclose(fp);
return 0;
}
2.fprintf():將agars(參數表)內各項的值,按format(格式控制字元串)所表示的格式,將數據格式為字元串的形式寫入到文件指針fp指向的文件中。
原型:fprintf(FILE *fp, const char *format, agars)
fprintf()和fscanf()相對應,其用法也基本和fscanf()相同。具體參照以下示例:
#include
#include
int main()
{
FILE *fp;
fp = fopen("test.txt","a+");
fprintf(fp,「%d %d」,123456,789);//將123456和789寫到test.txt文件中
fprintf(fp,"%s %s","China","ChongQing"); //將字元串China和ChongQing追加寫到test.txt文件中
fclose(fp);
return 0;
}
看我辛苦找的份上給個採納!
Ⅷ linux 有哪些寫文件的函數
write, writev, fwrite, fputc, fputs, putc