系統調用
訪問設備驅動程序的底層函數主要有:
open:打開文件或者設備。
read:從打開的文件或者設備里面讀取數據。
write:向文件或者設備寫數據。
close:關閉文件或者設備。
open系統調用:
int open (const char
*path,
int flags);
int open (const char
*path,
int flags, mode_t mode);
path表示文件名,flags用來定義準備對打開的文件進行操作的動作。
如果
open調用成功,則返回一個新的文件描述符(非負整型);如果失敗,就返回-
1。
close系統調用:
int close(
int filedes);
成功返回
0;出錯返回-
1;
read系統調用:
ssize_t
read(
int filedes, const void
*buf, size_t nbytes);< publishblog.blogchina.com http:>
將n個字節從文件描述符對應的文件讀出放入到buf中。成功則返回實際的讀取字節數。
write系統調用:
ssize_t
write(
int filedes, const void
*buf, size_t nbytes);
返回值是實際寫入的字節數(可能會小于nbytes);如果返回值是
0,表示沒有寫入任何數據;如果返回值是-
1,表示在
write調用中出錯了。
將n個字節從buf中寫入到文件描述符對應的文件中。
常用標準I/O庫文件函數:fopen,fwrite,fread,fclose,fflush,fseek,fgets,getchar,fputs等系列的函數
他們與系統調用的一個主要的區別在于,這是帶緩沖的函數,操作的對象不是int型的文件描述符,而是fopen返回的FILE型的文件指針(*fp).對應的標準輸入,輸出,出錯為stdin,stdout,stderr文件指針。
我把這些函數的用法全都寫在這里:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>#define SIZE 1024
int main0()
{FILE* fp = fopen (
"abc",
"ab+");
if (NULL == fp){perror (
"fopen");
return -
1;}
printf (
"打開文件成功\n");
return 0;
}
int main1()
{FILE* fp = fopen (
"BTree.c",
"ab+");
if (NULL == fp){perror (
"fopen");
return -
1;}
char buf[SIZE] = {
0};
int ret;
while (ret = fread (buf,
sizeof(
char), SIZE-
1, fp)){buf[ret*
sizeof(
char)] =
'\0';
printf (
"%s\n", buf);}
if (
0 == ret && !feof(fp)){perror (
"fread");
return -
1;}
printf (
"文件讀取結束\n");
return 0;
}
int main2()
{FILE* fp = fopen (
"1.ppt",
"ab+");
if (NULL == fp){perror (
"fopen");
return -
1;}FILE* fp1 = fopen (
"2.ppt",
"ab+");
if (NULL == fp1){perror (
"fopen");
return -
1;}
char buf[SIZE] = {
0};
int ret;
while (ret = fread (buf,
sizeof(
char), SIZE, fp)){fwrite (buf,
sizeof(
char), ret, fp1);}
if (
0 == ret && !feof(fp)){perror (
"fread");
return -
1;}
printf (
"文件讀取結束\n");fclose (fp);fclose (fp1);
return 0;
}
int main3()
{FILE* fp = fopen (
"1.ppt",
"ab+");
if (NULL == fp){perror (
"fopen");
return -
1;}FILE* fp1 = fopen (
"2.ppt",
"ab+");
if (NULL == fp1){perror (
"fopen");
return -
1;}
char buf[SIZE] = {
0};
int ret;
while(
1){
int c = fgetc (fp);
if (EOF == c){
break;}fputc (c, fp1);}fclose (fp);fclose (fp1);
return 0;
}
typedef struct student
{
int id;
char name[
20];
}STU;
void write_data(STU* a,
int len)
{FILE* fp = fopen (
"student",
"ab+");
if (NULL == fp){perror (
"fopen");
return;} fwrite (&len,
sizeof(
int),
1, fp);
int i;
for (i =
0; i < len; i++){len =
sizeof(a[i]); fwrite (&len,
sizeof(
int),
1, fp);fwrite (&a[i],
sizeof(STU),
1, fp);}fclose (fp);
}
void read_data()
{FILE* fp = fopen (
"student",
"ab+");
if (NULL == fp){perror (
"fopen");
return;}
int count;fread (&count,
sizeof(
int),
1, fp);
printf (
"記錄個數是:%d\n", count);
int i;STU tmp;
for (i =
0; i < count; i++){
int len;fread (&len,
sizeof(
int),
1, fp);fread (&tmp, len,
1, fp);
printf (
"id = %d, name = %s\n", tmp.id, tmp.name);}fclose (fp);
}
int main4()
{
int i;STU a[
20];
for (i =
0; i <
20; i++){a[i].id = i;
sprintf (a[i].name,
"zhang%d", i);}
int len =
sizeof(a)/
sizeof(a[
0]); write_data(a, len);read_data();
return 0;
}
int main5()
{close(
1);
int fd = open (
"test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR);
if (-
1 == fd){
printf (
"打開文件失敗\n");perror (
"open");
printf (
"%s\n", strerror(errno)); }
printf (
"fd = %d\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);
printf (
"asdadsafsfkj\n", fd);close(fd);
return 0;}
int main6()
{
int fd = open (
"BTree.c", O_RDONLY,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};ssize_t ret = read (fd, buf, SIZE-
1);
if (-
1 == ret){perror (
"read");}
if (
0 == ret){
printf (
"文件讀取結束\n");}
printf (
"len = %d\n",
strlen(buf));
printf (
"讀到%d字節:%s\n", ret, buf);
return 0;
}
int main7()
{
int fd = open (
"BTree.c", O_RDONLY,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};
while(
1){ssize_t ret = read (fd, buf, SIZE-
1);
if (-
1 == ret){perror (
"read");}
if (
0 == ret){
printf (
"文件讀取結束\n");
break;}
printf (
"%s", buf);}
return 0;
}
int main8()
{
int fd = open (
"BTree.c", O_RDONLY,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};
while(
1){
memset (buf,
0, SIZE); ssize_t ret = read (fd, buf, SIZE-
1);
if (-
1 == ret){perror (
"read");}
if (
0 == ret){
printf (
"文件讀取結束\n");
break;}
printf (
"%s", buf); }
return 0;
}
int main9()
{
int fd = open (
"BTree.c", O_RDONLY,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};
while(
1){ssize_t ret = read (fd, buf, SIZE-
1);
if (-
1 == ret){perror (
"read");}
if (
0 == ret){
printf (
"文件讀取結束\n");
break;}buf[ret] =
'\0';
printf (
"%s", buf);}
return 0;
}
int main10()
{
int fd = open (
"BTree.c", O_RDONLY,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};
char* p = buf;
int count = SIZE -
1; ssize_t ret =
0;
while (ret = read (fd, p, count)){
if (-
1 == ret){
if (errno == EAGAIN || errno == EINTR){
continue;}
break;}
printf (
"sfjsfsjfs\n");
if (ret == count){
break;}count -= ret; p += ret;}
printf (
"len = %d\n",
strlen(buf));
return 0;
}
int main11()
{
int fd = open (
"abc", O_WRONLY|O_CREAT,
0777);
if (-
1 == fd){perror (
"open");
return -
1;}
char buf[SIZE] = {
0};
while(
1){fgets (buf, SIZE, stdin);
if (
0 ==
strncmp (
"end", buf,
3)){
break;}ssize_t ret = write (fd, buf,
strlen(buf));
if (-
1 == ret){perror (
"write");}
printf (
"要寫的字節數:%d,實際寫的字節數:%d\n", SIZE, ret);}close(fd);
return 0;
}
int main12()
{
int fd1 = open (
"1.ppt", O_RDONLY);
if (-
1 == fd1){perror (
"open fd1");
return -
1;}
int fd2 = open (
"2.ppt", O_WRONLY|O_CREAT,
0777);
if (-
1 == fd2){perror (
"open fd2");
return -
1;}
int ret =
0;
char buf[SIZE] = {
0};
while (ret = read (fd1, buf, SIZE)){
if (-
1 == ret){perror(
"read");
break;}write (fd2, buf, ret);}
printf (
"文件復制完成\n");close (fd1);close (fd2);
return 0;
}
int main13()
{
int fd = open (
"abc2", O_RDWR|O_CREAT,
0777);
if (-
1 == fd){perror (
"open fd1");
return -
1;}lseek (fd,
20, SEEK_SET);
char* buf =
"hello";write (fd, buf,
strlen(buf));close (fd);
return 0;
}
int main14()
{
int fd = open (
"big", O_RDWR|O_CREAT,
0777);
if (-
1 == fd){perror (
"open fd1");
return -
1;}lseek (fd,
1024*
1024*
1024, SEEK_SET);
char* buf =
"hello"; write (fd,
"a",
1);close (fd);
return 0;
}
int main15()
{
while(
1){
printf (
"a");usleep (
2000);}
return 0;
}
int main16()
{
int fd = open (
"big", O_RDWR|O_CREAT,
0777);
if (-
1 == fd){perror(
"open fd1");
return -
1;}
printf (
"%d\n", fd);lseek (fd,
20, SEEK_SET);
printf (
"等待2些數據\n");getchar();
char* buf =
"hello";write (fd,
"a",
1);getchar();close (fd);
return 0;
}
int main17()
{
int fd1 = open (
"abc", O_RDWR|O_CREAT,
0777);
if (-
1 == fd1){perror (
"open fd1");
return -
1;}
printf (
"abc fd = %d\n", fd1);
int fd = open (
"big", O_RDWR|O_CREAT,
0777);
if (-
1 == fd){perror (
"open fd");
return -
1;}
printf (
"bif fd = %d\n", fd);lseek (fd,
10, SEEK_SET);
char *buf =
"12345";write (fd, buf,
strlen(buf));getchar();close (fd);
return 0;
}
void swap (
int* a,
int i,
int j)
{
int tmp = a[i];a[i] = a[j];a[j] = tmp;
}
void printA (
int* a,
int len)
{
int i;
for (i =
0; i < len; i++){
if (
0 == i %
4){
printf (
"\n");}
printf (
"%4d", a[len-i-
1]);}
putchar (
'\n');
}
int main18()
{srand ((
unsigned int)time(NULL));
int a[
40];
int i;
int len =
40;
for (i =
0; i <
40; i++){a[i] = i;}
for (i = len-
1; i >
0; i--){
int index = rand() % (i+
1); swap (a, index, i); }printA (a, len);
return 0;
}
總結
以上是生活随笔為你收集整理的Linux 文件系统编程之系统调用和标准I/O库的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。