在学习linuxc实战编程中用到的一些比较重要的知识

关于chomd函数

  • man 名称:获得函数原型

  • 因为有些函数既是Linux命令,也是系统调用 eg:chomd

    • man 2 名称 :获得该函数原型
    • man 名称 :获得命令的帮助信息
  • 对于库函数 eg: opendir
    • man 3 名称:可以获得帮助信息

出错的地方:排序,把东西放到里面;

​ 没有关闭dir;用一次关一次,定义一次;

​ 打不开一个目录的原因:1.没有切换路径,在这个路径下只能打开此路径下的目录与文件,如:在/home/lala下有个目录 .cahe 然后里面有个目录,然后如果你要打开这个目录下的东西你就要切换路径

目录必须有读权限

  • 作用:

    • 对文件权限的修改
  • 函数原型

    • “`c

    include

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc,char **argv)
{
    int mode;//权限
    int mode_u;//所有者的权限
    int mode_g;//所属组的权限
    int mode_o;//其他用户的权限
    char *path;
    /*检查参数个数的合法性*/
    if(argc<3)
    {
        printf("%s <mode num> <target file>\n",argv[0]);
        exit(0);
    }
    /*获取命令行做参数*/
    mode=atoi(argv[1]);
    if(mode>777||mode<0)
    {
        printf("mode num error!\n");
        exit(0);
    }
    mode_u=mode/100;
    mode_g=(mode -(mode_u*100))/10;
    mode_o=mode-(mode_u*100)-mode_g*10;
    mode=(mode_u*8*8)+(mode_g*8)+mode_o;
    path=argv[2];
    if(chmod(path,mode)==-1)
    {
        perror("chmod error");
        exit(1);
    }
    return 0;
}
  • 有几个注意的地方:

    • LINE=5:
    int main(int argc,char **argv)  

    argc: argv的个数

    argv: 命令行参数,这个参数是通过命令提示符窗(终端)口运行程序,以空格区分参数格式带入的

    这时就有一个问题:为什么是** argv,而不是 *argv?

    ​ 1.“hello world”这个字符常量的返回值是什么?

    一个字符串常量的返回值是char * ,反之也可以用char *存取字符串,那么**argv也很好理解了,ta就是一个指向字符串的指针

    ​ 2.eg: 当你在终端打入 ./a.out ls -a 时,argv[0]就是./a.out argv[1]就是ls argv[2]就是-a

    argv[0]相当于一个二维数组,argv 0 0=’.’以此类推

    • LINE=19:
    mode=atoi(argv[1]);
    • 原型:
    int atoi(const char *ptr);
    • 功能:将字符串转换成整形数字。

      ​ atoi会扫面参数ptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串结束标志(‘\0’)时才结束转换,并将结果返回。

    • eg:

    
    #include<stdio.h>
    
    
    #include<stdlib.h>
    
    int main(void)
    {
        char a[]=" 132 2";
        int c;
        c=atoi(a);
        printf("%d\n",c);
    }

    结果是:

    ![2018-07-28 14-45-51 的屏幕截图](/home/lala/图片/2018-07-28 14-45-51 的屏幕截图.png)

文件的输入输出函数

对于内核而言,所有打开的文件都是由文件描述符标识的。文件描述符是一个非负整数,在读写一个文件前,需要调用open或creat函数打开文件,成功执行这两个函数都将返回一个文件描述符,在对文件执行读写操作时,将其作为参数传给read或write

文件描述符 文件描述符表示的东西
0 标准输入文件(键盘)(stdin)
1 标准输出文件(显示器)(stdout)
2 标准错误(显示器)(stderr)

* #### open

  • 功能: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);
  • 参数的解析

    • const char *pathname:要打开或者创建的韩路径的文件名

    • flags:打开文件的方式

      前三种打开的方式是互斥的,但前三种可以和后面几种进行或运算

    打开方式 说明
    O_RDONLY 只读打开
    O_WRONLY 只写打开
    O_RDWR 可读可写打开
    O_CREAT 文件不存在自动创建,只有在此时,用到了第三个参数mode来说明新文件的权限
    O_EXCL 如果O_CREAT也被设置,则先看文件是否存在,不能存在则创建,存在会导致打开文件出错
    O_TRUNC 文件存在并且以可写的方式打开时,此标志会将文件长度清0(数据丢失),但文件属性不变
    O_APPEND 写入的数据会以追加的方式加到文件后面
    O_SYNC 以同步的方式打开文件,任何对文件的修改会阻塞直到物理磁盘上的数据同步后才返回
    O_NOFOLLOW 如果参数pathname所指的文件是一个符号链接则会使打开文件失败
    O_DIRECTORY 所指的文件不是一个目录,则会使打开的文件失败
    O_NONBLOCK/O_NDELAY 以非阻塞的方式打开文件对于open及随后的对该文件的操作,都会立即返回
    • 注:新文件的实际权限是mode和umask按照(mode&~umask)运算以后的结果 eg:umask:045,mode:0740,则新建立的权限实际是0700(先~ 再&)
    • mode与chmod中的mode一样
  • 成功调用:返回一个文件描述符

    错误:返回-1

    • #### creat
  • 功能:创建一个文件

  • 原型:

    
    #include<sys/types.h>
    
    
    #include<sys/stat.h>
    
    
    #include<fcntl.h>
    
    int creat(const char *pathname,mode_t mode);
  • 对参数的解析:

    • pathname:要打开和创建的文件名
      • 如果所指文件不存在,则创建一个
      • 如果存在,则旧的会被新的覆盖
    • mode也相同
  • 成功:返回一个文件描述符

    ​ 失败:返回-1

  • 注意:creat只能以只写的方式打开创建的文件,无法创建设备文件,设备文件的创建要使用mknod函数

    • #### close
  • 作用:close系统调用用来关闭一个已经打开的文件

  • 原型:

    
    #include<unistd.h>
    
    int close(int fd);
  • 调用成功:返回0

    失败:返回-1

  • close调用成功时不能保证数据能全部写回键盘,其实用户可以不必调用此函数,因为进程结束时内核会自动关闭

    • 关于open,creat,close的综合运用
    
    #include<stdio.h>
    
    
    #include<stdlib.h>
    
    
    #include<sys/types.h>
    
    
    #include<sys/stat.h>
    
    
    #include<fcntl.h>
    
    
    #include<unistd.h>
    
    
    #include<errno.h>
    
    int main(void)
    {
      int fd;
      if((fd=open("a.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1)
    //if((fd=creat("a.c",S_IRWXU))==-1)
      {
          //printf("open:%s with error:%d\n",strerror(errno),errno);
          perro("open");
          exit(1);
      }
      close(fd);
      return 0;
    }
    • #### read
  • 作用:read系统调用用来从打开的文件中读取数据

  • 原型:

    
    #include<unistd.h>
    
    ssize_t read(int fd,void *buf,size_t count);
  • 参数:

    从文件描述符fd所指的文件中读取count个字节的数据到buf所指的缓存中去

    返回值表示实际读取的字节数

    如果count=0:read不会读取数据,只返回0。

    返回值表示0:如果已经到文件尾或是无可读取的数据。

    如果返回字节数与要求读的字节数一样:则没问题。

    如果小:可能读到了文件尾部或者read被信号中断了读取过程

  • 错误:返回-1 正确:返回读取的字节数

猜你喜欢

转载自blog.csdn.net/lalala323/article/details/81277045