Linux指令(更新中)


Linux指令

文件操作

1.创建文件

int open(const char &pathname,int flags,mode_t mode);
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char &pathname,int flags,mode_t mode);
    参数: 
        -pathname:要创建的文件的路径
        -flags:对文件的操作权限和其他设置
            -必选项:O_RDONLY O_WRONLY O_RDWR
            -可选项:O_CREAT 文件不存在创建文件
        -mode:八进制的数,表示创建出的新文件的操作权限,比如:0775
        最终的权限是:mode & ~umask
        0777 -> 111111111   
    &
        0775 -> 111111101
    -----------------------------------------
                111111101
    按位与:0和任何数都为0
    umask抹去某些权限
    flags参数是一个int类型数据,占4个字节 32位
    flag 32个位 每一个位都是一个标志位。
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<unistd.h>
int main(){
    //创建一个新的文件
    int fd = open("create.txt", O_RDWR | O_CREAT, 0777);
    if(fd == -1){
        perror("open");
    }
    //关闭
    close(fd);
    return 0;
}

2.打开已存在文件

int open(const char &pathname,int flags);
/*
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        //打开一个已经存在的文件
        int open(const char &pathname,int flags);
            参数:
                - pathname:要打开的文件的路径
                - flags:对文件的操作权限和其他设置
                  O_RDONLY O_WRONLY O_RDWR 这三个设置是互斥的
            返回值:返回一个新的文件描述符。如果调用失败返回-1
        errono:属于linux系统函数库,库里面的一个全局变量 记录的是最近的错误号。
        
        #include <stdio.h>
        void perror(const char *s); 作用:打印error对应的错误描述
            s参数:用户描述,比如hello,最终输出的内容是hello:xxx(实际的错误描述)

        #include <errno.h>

        //创建一个新的文件
        int open(const char &pathname,int flags,mode_t mode);

       
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<stdio.h>
int main(){
    int fd = open("a.txt", O_RDONLY);
    if(fd == -1){
        perror("open");
    }
    //读写操作
    
    //关闭
    close(fd);
    return 0;
}

3.复制文件

ssize_t read(int fd,void *buf,size_t count);
ssize_t write(int fd,void *buf,size_t count);
/*
    #include<unistd.h>
    ssize_t read(int fd,void *buf,size_t count);
        参数:
            -fd:文件描述符 ,open得到的,通过这个文件描述符操作某个文件
            -buf:需要读取数据存放的地方,数组的地址
            -count:指定的数组的大小
        返回值:
            -成功:
                >0:返回实际读取到的字节数
                =0:文件已经读取完成
            -失败:-1 ,并且设置perror
    #include<unistd.h>
    ssize_t write(int fd,void *buf,size_t count);
        参数:
            -fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
            -buf:要往磁盘写入的数据,数据
            -count:要写的数据的实际大小
        返回值:
            -成功:
                >0:返回实际读取到的字节数
                -失败:-1 ,并且设置perror
*/
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(){
    //通过open打开english.txt
    int srcfd = open("english.txt", O_RDONLY);
    if(srcfd == -1){
        perror("open");
        return -1;
    }
    //创建一个新的文件(拷贝文件)
    int destfd = open("cpy.txt", O_WRONLY | O_CREAT, 0664);
    if(destfd == -1){
        perror("open");
        return -1;
    }
    //频繁的读写操作
    char buf[1024] = {0};
    int len = 0;
    while ((len = read(srcfd, buf, sizeof(buf)))>0){
        write(destfd, buf, len);
    }
    //关闭文件
    close(destfd);
    close(srcfd);
    return 0;
}

4.lseek

/*
    标准C库函数
    #include<stdio.h>
    int fseek(FILE *stream,long offset,int whence)
    
    Linux 系统函数
    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);
        参数
            -fd:文件描述符,通过open得到,通过fd操作某个文件
            -offset:偏移量
            -whence:
                SEEK_SET
                    设置文件指针的偏移量
                SEEK_CUR
                    设置偏移量:当前位置+第二个参数offset的值
                SEEK_END    
                    设置偏移量:文件大小+第二个参数offset的值
        返回值:返回文件指针的位置
    作用:
        1.移动文件指针到文件头
        lseek(fd,0,SEEK_SET);
        
        2.获取当前文件指针的位置
        lseek(fd,0,SEEK_CUR);

        3.获取文件长度
        lseek(fd,0,SEEK_END);

        4.扩展文件的长度,当前文件10b,110b,增加了100b
        lseek(fd,100,SEEK_END);从文件末尾向后偏移100

        注意:需要写入一次数据
        
*/
#include <sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <unistd.h>
#include<stdio.h>
int main(){
    int fd = open("hello.txt", O_RDWR);
    if(fd == -1){
        perror("open");
        return -1;
    }
    //扩展文件的长度
    int ret = lseek(fd, 100, SEEK_END);
    if(ret == -1){
        perror("lseek");
        return -1;
    }
    //写入一个空数据
    write(fd, " ", 1);
    close(fd);
    return 0;
}

5.获取文件信息

int stat(const char *pathname, struct stat *statbuf);
/*
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *pathname, struct stat *statbuf);
            作用:获取一个文件信息
            参数:
                -pathname:操作的文件的路径
                -statbuf:结构体变量,传出参数,用于保存获取到的信息
            返回值:
                成功:返回0
                失败:返回-1,设置errno

       int lstat(const char *pathname, struct stat *statbuf);
            参数:
                -pathname:操作的文件的路径
                -statbuf:结构体变量,传出参数,用于保存获取到的信息
            返回值:
                成功:返回0
                失败:返回-1,设置errno        

*/
#include<sys/types.h>
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
int main(){
    struct stat statbuf;
    int ret = stat("a.txt", &statbuf);
    if(ret == -1){
        perror("stat");
        return -1;
    }
    printf("size: %ld\n", statbuf.st_size);
    return 0;
}

6.判断某个文件是否有某个权限,或者某个文件是否存在

int access(const char * pathname,int mode);
/*
       #include <unistd.h>

       int access(const char *pathname, int mode);
        作用:判断某个文件是否有某个权限,或者判断文件是否存在
        参数:
            -pathname :判断的文件路径
            -mode:
                R_OK:判断文件内是否有读权限
                W_OK:判断文件内是否有写权限
                X_OK:判断文件内是否有执行权限
                F_OK:判断文件内是否存在
        返回值:
            成功返回0 ,失败返回-1
*/


#include<unistd.h>
#include<stdio.h>
int main(){
    int ret = access("a.txt", F_OK);
    if(ret == -1){
        perror("access");
        return -1;
    }
    printf("文件存在!!\n");
    return 0;
}

7.修改文件的权限

int chmod(const char *pathname,mode_t mode);
/*
       #include <sys/stat.h>

       int chmod(const char *pathname, mode_t mode);
        作用:修改文件的权限
        参数:
            -pathname 需要修改的文件的路径
            -mode:需要修改的权限值,八进制的数
        返回值:成功返回0 失败返回-1

*/
#include<unistd.h>
#include<sys/stat.h>
#include<stdio.h>
int main(){
    int ret = chmod("a.txt", 0777);
    if(ret == -1){
        perror("chmod");
        return -1;
    }
    return 0;
}

8.缩减或扩展文件到指定的大小

int truncate(const char *path,off_t length);
/*
SYNOPSIS
       #include <unistd.h>
       #include <sys/types.h>

       int truncate(const char *path, off_t length);
            作用:缩减或扩展文件的尺寸至指定的大小
            参数:
                -path:需要修改的文件的路径
                -length:需要最终文件变成的大小
            返回值:成功返回0 失败返回-1
*/
#include <unistd.h>
#include <sys/types.h>
#include<stdio.h>
int main(){
    int ret = truncate("b.txt", 5);
    if(ret == -1){
        perror("truncate");
        return -1;
    }
    return 0;
}

9.创建一个目录

int mkdir(const char* pathname,mode_t mode);
/*
       #include <sys/stat.h>
       #include <sys/types.h>

       int mkdir(const char *pathname, mode_t mode);
        作用:创建一个目录
        参数:  
            pathname:创建的目录的路径
            mode:权限 8进制的数
        返回值:
            成功返回0 失败返回-1
*/ 

#include <sys/stat.h>
#include <sys/types.h>
#include<stdio.h>
int main(){
    int ret = mkdir("aaa", 0777);
    if(ret == -1){
        perror("mkdir");
        return -1;
    }
    return 0;
}

10.修改目录名称

int rename(const char *oldpath,const char *newpath);
/*
       #include <stdio.h>

       int rename(const char *oldpath, const char *newpath);

*/
#include <stdio.h>
int main(){
    int ret = rename("aaa", "bbb");
    if(ret == -1){
        perror("rename");
        return -1;
    }
    return 0;
}

11.修改进程的工作目录

int chdir(const char *path);
/*
       #include <unistd.h>

       int chdir(const char *path);
            作用:修改进程的工作目录
                比如在/home/yxy目录下启动了一个可执行程序a.out,进程的工作目录/home/yxy
            参数:
                path:需要修改的工作目录

       #include <unistd.h>

       char *getcwd(char *buf, size_t size);
       作用:获取当前的工作目录
       参数:
            -buf:存储的路径,指向的是一个数组,传出参数
            -size:数组的大小

        返回值:
            返回的指向的一块内存,这个数据就是第一个参数


*/


#include <unistd.h>
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
int main(){
    //获取当前的工作目录
    char buf[128];
    getcwd(buf, sizeof(buf));
    printf("当前的工作目录是:%s\n",buf);

    //修改工作目录

    int ret = chdir("/home/yxy/Linux/lesson13");
    if(ret == -1){
        perror("chdir");
        return -1;
    }

    //创建一个新的文件
    int fd = open("chdir.txt", O_CREAT | O_RDWR, 0664);
    if(fd == -1){
        perror("open");
        return -1;
    }
    close(fd);

    //获取当前的工作目录
    char buf1[128];
    getcwd(buf1, sizeof(buf));
    printf("当前的工作目录是:%s\n",buf1);

    return 0;
}

2.内存映射的注意事项

1.如果对mmap的返回值(ptr)做++操作,munmap是否能成功

void * ptr = mmap(….);
ptr++;可以进行++操作
munmap(ptr,len); //错误,要保存地址 new delete

2.如果open时O_RDONLY,mmap时prot参数指定PROT_READ | PROT_WRITE 会怎样?

错误,返回MAP_FAILED;
open()函数中的权限建议和PROT参数的权限保持一致

3.如果文件偏移量1000 会怎样?
偏移量必须是4k的整数倍,错误,返回MAP_FAILED

4.mmap什么情况下会调用失败?
-第二个参数 length = 0
-第三个参数 prot
-只指定了写权限
- prot PROT_READ | PROT_WRITE
第五个参数通过open函数时指定的O_RDONLY /O_WRONLY

5.可以open的时候O_CREAT 一个新文件来创建映射区吗?
-可以的,但是创建的文件的大小如果为0的话,肯定不行
-可以对新的文件进行扩展
-lseek()
-truncate()

6.mmap后关闭文件描述符,对mmap映射有没有影响?
int fd = open(“xxx”);
mmap(,,,fd,,);
close(fd);
映射区还在,创建映射区的fd被关闭了没有任何影响

7.对ptr越界操作会怎么样?
void * ptr = mmap(NULL,100,,,,);
4K
越界操作操作的是非法的内存,—>产生段错误

阻塞信号集和未决信号集

1.用户通过键盘 crtl + c产生2号信号SIGINT(信号被创建)
2.信号产生但是没有被处理(未决)
在内核中将所有的没有被处理的信号存储在一个集合中(未决信号集)
SIGINT信号状态被存储在第二个标志位上
这个标志位的值为0,说明信号不是未决状态
这个标志位的值为1,说明信号处于未决状态
3.这个未决状态的信号需要被处理,处理之前需要和另一个信号集(阻塞信号集),进行一个比较。
-阻塞信号集默认不阻塞任何的信号
-如果先要阻塞某些信号,需要用户调用系统的API

4.在处理的时候和阻塞信号集中的标志位进行查询,看是不是对该信号设置阻塞。
-如果没有阻塞,这个信号就被处理。
-如果阻塞了,这个信号就继续处于未决状态,直到阻塞接触,这个信号被处理。


评论
  目录