open
#include <unistd.h>
#include<fcntl.h>
#include<stdio.h>
int main()
{
//open (const char *__path, int __oflag, ...)
//const char *__path:打开文件的路径
//int __oflag:打开文件的模式
// (1) O_RDONLY只读模式
// (2) O_WRONLY 只写模式
// (3) O_RDWR 读写模式
// (4) O_CREAT 创建新文件,如果文件存在,则清空
// (5) O_TRUNC 若文件存在,则清空文件
// (6) O_APPEND 若文件存在,则追加写
// (7) O_EXCL 如果 O_CREAT 被设置,并且同一时间另一个进程也在创建该文件,则返回 -1
// (8) O_NOCTTY 如果 O_CREAT 被设置,并且 __path 所指的文件是一个终端设备,则返回 -1
// (9) O_NOFOLLOW 如果 O_CREAT 被设置,并且 __path 所指的文件是一个符号链接,则返回 -1
// ...可变参数:O_CREAT 创建文件的权限 0664代表 读写 读写 读 0开头代表八进制
//return: 文件描述符 如果打开文件失败 返回-1 同时设置全局变量errno表示对应的错误
//Linux有文件权限保护位 默认创建的权限会被删除掉其他用户的权限
int fd = open("io1.txt",O_RDONLY | O_CREAT,0664);
if(fd == -1)
{
printf("打开失败");
}
return 0;
}
Makefile
unistd_test: unistd_test.c
-$(CC) -o $@ $^
-./$@
-rm ./$@
执行后的结果查看权限
read
//read (int __fd, void *__buf, size_t __nbytes)
//int __fd: 要读取的文件的描述符
//void *__buf: 接收读取的数据的缓冲区
//size_t __nbytes: 要读取的字节数
//return: ssize_t ->long int: 读取到数据的字节长度 成功大于0 失败-1
read(fd,buffer,sizeof(buffer))
综合示例
此代码的作用是读取文本文件内的内容并输出
# include <unistd.h>
# include <fcntl.h>
# include <stdio.h>
# include <stdlib.h>
int main()
{
int fd = open("io.txt",O_RDONLY);
if(fd == -1)
{
perror("open");
//printf("打开文件失败");
exit(EXIT_FAILURE);
}
char buffer[1024]; //存放读取数据
ssize_t bytes_read;
//read (int __fd, void *__buf, size_t __nbytes)
//int __fd: 要读取的文件的描述符
//void *__buf: 接收读取的数据的缓冲区
//size_t __nbytes: 要读取的字节数
//return: ssize_t ->long int: 读取到数据的字节长度 成功大于0 失败-1
while ((bytes_read = read(fd,buffer,sizeof(buffer)))>0)
{
//ssize_t write (int __fd, const void *__buf, size_t __n) __wur
//int __fd: 要写入的文件的描述符
//const void *__buf: 要写入的数据
//size_t __n: 要写入的字节数
//return: ssize_t -> long int: 成功返回写入的字节数 失败-1
write(STDOUT_FILENO,buffer,bytes_read);
}
if(bytes_read == -1)
{
perror("read");
//成功返回0 失败返回-1
close(fd);
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
Makefile
system_call_test: system_call_test.c
-$(CC) -o $@ $^
-./$@
-rm ./$@
输出结果