概述
系统调用与标准I/O库
一、系统调用概述
UNIX系统的软件层次
1.系统调用是操作系统提供给用户程序的一组“特殊”接口。
2.Linux的不同版本提供了两三百个系统调用。
3.用户程序可以通过这组接口获得操作系统(内核)提供的服务。
例如:
用户可以通过文件系统相关的系统调用,请求系统打开文件、关闭文件或读写文件。
4.系统调用按照功能逻辑大致可分为:
进程控制、进程间通信、文件系统控制、系统控制、内存管理、网络管理、 socket控制、用户管理。如下图:
5.系统调用通常通过函数进行调用。
系统调用的返回值:
通常,用一个负的返回值来表明错误,返回一个0值表明成功。错误信息存 放在全局变量errno中,用户可用perror函数打印出错信息。
6.在Linux中,应用程序编程接口(API)遵循POSIX标准。
POSIX标准描述了操作系统的函数接口规范(函数名、返回值、参数等)。不 同操作系统下编写的程序只要遵循POSIX标准,程序都可以直接移植。
如:
linux下写的open、write 、read可以直接移植到unix操作系统下。
二、系统调用I/O函数
1.系统调用中操作I/O的函数,都是针对文件描述符的。通过文件描述符可以直接对相应的文件进行操作。
如:open、close、write 、read、ioctl
2. 文件描述符
文件描述符是非负整数。打开现存文件或新建文件时,系统(内核)会返回一个文件描述符。文件描述符用来指定已打开的文件。
3. 程序运行起来后这三个文件描述符是默认打开的。
#defineSTDIN_FILENO 0 //标准输入的文件描述符
#defineSTDOUT_FILENO 1 //标准输出的文件描述符
#defineSTDERR_FILENO 2 //标准错误的文件描述符
4. open函数:打开一个文件
#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:open函数的行为标志。
mode:文件权限(可读、可写、可执行)的设置。
返回值:
成功返回打开的文件描述符。
失败返回-1,可以利用perror去查看原因
例:open(“/home/…/text”,O_RDONLY);
char *p=” /home/…/text”;
open(p,O_RDONLY);
5. close函数:关闭一个文件
#include <unistd.h>
int close(int fd);
参数:
fd是调用open打开文件返回的文件描述符
返回值:
成功返回0。
失败返回-1,可以利用perror去查看原因
6. write函数:把指定数目的数据写到文件
#include <unistd.h>
ssize_t write(int fd, const void *addr,size_t count);
参数:
fd:文件描述符。
addr:数据首地址。
count:写入数据的字节个数。
返回值:
成功返回实际写入数据的字节个数。
失败返回-1,可以利用perror去查看原因。
7. read函数:把指定数目的数据读到内存
#include <unistd.h>
ssize_t read(int fd, void *addr, size_t count);
参数:
fd:文件描述符。
addr:内存首地址。
count:读取的字节个数。
返回值:
成功返回实际读取到的字节个数。
失败返回-1,可以利用perror去查看原因。
例子:read wirte 读取写入数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
int fd;
char* path = "/home/liang/MyLearn/file/text";
char buff1[40],buff2[] = "-end:";
printf("程序开始n");
//以可读可写方式打开文件,并赋予文件所有者rwx权限
if ( (fd = open(path,O_RDWR|O_CREAT,0700)) < 0){
perror("打开失败n");
return -1;
}
printf("打开文件:%sn",path);
printf("请输入要写入文件的字符:");
scanf("%s",buff1);
//strlen(buff1) buff1所含的字符数
if( write(fd,buff1,strlen(buff1)) < 0 ){
perror("写入文件失败");
return -1;
}
printf("写入成功n");
buff1[0]='