linux文件编程

系统调用

系统调用:由操作系统实现并提供给外部应用程序的编程接口。

用户程序运行在0-3g位置,内核程序运行在3-4g位置。

系统调用函数其实就是调用了内核的函数,系统函数是对内核函数做了一层封装。比如open函数,其实在它的内部是调用了sys_open函数。

man手册的使用:

open函数

函数原型:int open(const char * pathname,int falgs);int open(const char * pathname,int falgs,mode_t mode);int close(int fd);

常用参数:(需包含头文件fcntl.h)O_RDONLY O_WRONLY O_RDWRO_APPEND O_CREAT O_EXCL O_TRUNC O_NONBLOCK创建文件时,指定文件访问权限。权限同时受umask影响。文件权限=mode&~umask

open常见错误:打开不存在的文件(open返回-1),errno变量(需包含error.h文件)在文件打开错误时会被自动赋值,就像一个全局变量一样。以只写方式打开只读文件以只写方式打开目录

#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
int main()
{
    int fd;
    fd=open("./file03.txt",O_RDONLY|O_CREAT|O_TRUNC,0777);
    printf("fd=%d\n,errno=%d:%s\n",fd,errno,strerror(errno));
    close(fd);
    return 0;
}

read函数

ssize_t read(int fd,void* buf,size_t count);参数:fd:文件描述符buf:存数据的缓存区count:缓冲区大小返回值:成功:读到的字节数失败:-1,设置errno

write函数

ssize_t write(int fd,const void* buf,size_t count);参数:fd:文件描述符buf:存数据的缓存区count:实际要写入的字节数返回值:成功:写入的字节数失败:-1,并且会设置errno

实现cp

实现一个拷贝文件的程序。

#include<unistd.h>  //文件相关函数
#include<stdio.h>   //标准输入输出
#include<stdlib.h>  //使用perror
#include<fcntl.h>   //宏定义
#include<errno.h>
#include<string.h>
int main(int argc,char *argv[])
{
    char buf[1024];  
    int n=0;
    
    int fd1=open(argv[1],O_RDONLY);
    if(fd1==-1)     //这里==写成了=,导致老是在这里异常退出
    {
        perror("open argv1 error");
        exit(1);
    }

    int fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);  //倘若文件2的权限为只读(权限误写成0644),那么程序就会卡在这里
    if(fd2==-1)
    {
        perror("open argv2 error");
        exit(1);
    }
    while((n=read(fd1,buf,1024))!=0)
    {
        if(n<0)
        {
            perror("read error");
            break;
        }
        write(fd2,buf,n);
    }
    close(fd1);
    close(fd2);

    return 0;
}


argv数组的第0个元素就是程序执行时的程序名字。

全部评论

相关推荐

09-24 18:30
已编辑
长春工业大学 产品经理
小肥罗:HR就是好人的缩写哈哈哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务