一、 Linux系统调用及用户编程接口(API)
1、所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务。
系统调用仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。在实际使用中程序员调用的通常是用户编程接口—API,系统命令相对API更高了一层,它实际上是一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。
2、Linux一点哲学,“一切皆为文件”;在Linux中对目录和设备的操作都等同于对文件的操作,都是使用文件描述符来进行的。
Linux文件可分为:普通文件,目录文件,链接文件,设备文件
3、一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理
标准输入 0 STDIN_FILENO
标准输出 1 STDOUT_FILENO
标准出错 2 STDERR_FILENO
常创建模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IXRWU 可读、可写、可执行
除用以上宏来选择创建模式,也可以用数字来表示
二、系统调用函数
1 创建文件 creat
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
int ret;
ret = creat("creat.txt",S_IRWXU | S_IRWXG); //文件拥有者和同组其他人
if (ret == -1)
{
perror("creat");
exit(1);
}
return 0;
}
2 打开文件 open
#include <string.h>
int main()
{
int fd,ret;
/*char buf[100] = {"hello world"};*/
char buf[100] = {0};
fd = open("creat.txt",O_RDWR | O_CREAT ,0666);
if (-1 == fd)
{
perror("open");
exit(1);
}
/* ret = write(fd,buf,strlen(buf));
if (-1 == ret)
{
perror("write");
exit(1);
}*/
/ memset(buf,0,strlen(buf));
ret = read(fd,buf,sizeof(buf));
if (-1 == ret)
{
perror("read");
exit(1);
}
printf("READ TXT is:%s\n",buf);
close(fd);
return 0;
}
3、利用read函数,write函数实现cp命令
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
int fd[2] = {0};
int ret;
char buf[100] = {0};
fd[0] = open(argv[1],O_RDONLY);
if(fd[0] < 0)
{
perror("open1");
exit(1);
}
fd[1] = open(argv[2],O_RDWR | O_CREAT | O_EXCL,777);
if (fd[1] < 0)
{
perror("open2");
exit(1);
}
while((ret = read(fd[0],buf,sizeof(buf))) != 0)
{
ret = write(fd[1],buf,ret);
if (ret < 0)
{
perror("write");
exit(1);
}
memset(buf,0,sizeof(buf));
}
return 0;
}
4、int lseek(int fd, offset_t offset, int whence)
功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置
SEEK_SET 相对文件开头 SEEK_CUR 当前位置 SEEK_END 相对文件末尾
三、标准库函数
1、标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。
它提供了三种类型的缓存: 1) 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。 2) 行缓存。当输入输出遇到新行符或缓存满时,才由标准 I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。 3) 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。
2、库函数创建与打开
r 只读方式打开,文件必须已存在 w 只写方式打开,如果文件不存在则创建,文件存在清空重写 a只能在末尾追加数据,文件不存在则创建
四、标准库函数
fread 与 fwrite
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
int ret;
char buf[100] = {0};
scanf("%s",buf);
fp = fopen("hello.txt","w");
if (fp == NULL)
{
perror("fopen");
exit(1);
}
/* ret = fread(buf,1,sizeof(buf),fp);
if (ret == 0)
{
perror("fread");
exit(1);
}
printf("%s",buf);*/
ret = fwrite(buf,1,strlen(buf),fp);
if (ret == 0)
{
perror("fwrite");
exit(1);
}
return 0;
}
利用fread函数实现cat命令
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[]) (利用命令行参数输入)
{
FILE *fp;
int ret;
char buf[100] = {0};
fp = fopen(argv[1],"r");
if (fp == NULL)
{
perror("fopen");
exit(1);
}
while((ret = fread(buf,1,sizeof(buf)-1,fp)) != 0) (最好减1)
{
printf("%s",buf);
memset(buf,0,sizeof(buf));
}
return 0;
}