linux系统编程1
1、C语言的fopen和fclose函数
#include <stdio.h>
int main()
{char ch;FILE *fp=fopen("/root/sh.txt","a");if(fp!=NULL){ fputs("i love biancheng\n",fp); }fclose(fp);printf("ok\n"); return 0;
}
使用vi编辑器创建文件write.c,然后输入上面内容,这里的代码就是C语言实现了文件的创建,采用的是a,即追加模式,不管/root/sh.txt文件有没有,有则追加,无则创建,然后向文件添加一个字符串内容i love biancheng,保存退出后,使用gcc编译,然后运行,结果如下:
文件内容写入成功,然后进行读取文件内容,vi read.c编写以下代码
#include <stdio.h>
int main()
{char str[101];FILE *fp=fopen("/root/sh.txt","r");if(fp!=NULL){ while(fgets(str,100,fp)!=NULL){printf("%s",str);}}fclose(fp);printf("ok\n"); return 0;
}
这里的代码就是打开上面创建的文件,然后以字符串读取内容并输出,最后关闭,编译,执行,效果如下:
2、系统调用
什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface, API)。是应用程序同系统之间数据交互的桥梁。
C 标准函数和系统函数调用关系。一个 helloworld 如何打印到屏幕
c库函数与系统函数的关系
3、Linux系统的open和close函数
1、open函数创建及打开文件
系统调用提供了open函数,open函数在打开不存在的文件时候允许创建,同时提供了两种实现方式,这两种区别在于创建的文件是否可以写入指定权限。
1.open函数原型:int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
2.参数1:const char *pathname,该文件路径;
参数2:int flags, 打开文件的三种模式O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写),三者选其一,另外,选择以上其中一个参数后还可以选以下参数:
O_CREAT 若文件不存在则创建它。使用此选项时,需同时说明参数3mode,其
说明该新文件的存取许可权限;
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则返回-1;
O_APPEND 每次写时都加到文件尾端;
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或者
只写成功打开,则将其长度截短为0。
3.返回值:如果文件成功创建或打开则返回文件对应的文件描述符(大于0的整数),否则返
回-1。(其中linux系统中默认0-标准输入,1-标准输出,2-标准错误)
4.包含特定头文件:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
1.1普通打开
函数 | int open(char *pathname, int flags) |
参数 | pathname:要打开的文件路径名 flags:文件打开方式,O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写) |
返回值 | 成功: 打开文件所得到对应的文件描述符(整数)失败: -1, 设置errno |
体验一下,用vi open.c,输入以下代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{int fd; fd=open("/root/sh.txt",O_RDONLY);if(fd==-1){printf("fd=%d,fail\n",fd); }else{printf("fd=%d,success\n",fd); } return 0;
}
gcc编译执行,结果如下:
1.2 指定权限打开
函数 | int open(char *pathname, int flags, mode_t mode) |
参数 | pathname:要打开的文件路径名 flags:文件打开方式 O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK… mode:参数3使用的前提, 参数2指定了 O_CREAT,取值8进制数,用来描述文件的访问权限,如: rwx 0664,创建文件最终权限 = mode & ~umask |
返回值 | 成功: 打开文件所得到对应的文件描述符(整数) 失败: -1, 设置errno |
第3个参数mode_t mode的权限设置用的八进制处理,详细对照表:
体验一下,用vi open2.c,输入以下代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{int fd; fd=open("/root/sh2.txt",O_RDONLY);if(fd==-1){ printf("fd=%d,fail\n",fd);fd=open("/root/sh2.txt",O_CREAT,0777);if(fd!=-1){printf("fd=%d,success\n",fd);}} return 0;
}
gcc编译通过,执行,效果如下:
发现一个问题了吧,代码中指定权限是777,为何最后权限是755?代码中指定权限是777,为何最后权限是755?其中奥秘是:创建文件最终权限 = mode & ~umask。
1、umask详解
umask(user file-creatiopn mode mask)是linux中的一个命令,用于为用户文件创建权限掩码,语法“umask [-S][权限掩码]”;其中,“权限掩码”是由3个八进制的数字所组成,查看umask 命令为: umask,
2、mode & ~umask详解
~umask的意思是将umask取反,0022是8进制,要转成2进制,根据
0022转成2进制是将每个8进制的数都要用3位的2进制表示,即8进制的2转成2进制是010,所以0022转成2进制是000000010010,~就是取反操作,000000010010取反就是111111101101,同时在上面例子中,设置的mode是0777,换成2进制是000111111111,&是与运算,01=0,11=1,所以最终权限 = mode & ~umask,即
000 111 111 111
111 111 101 101
&的结果是:000 111 101 101,111是7,101是5,最后就是0755,即755,而755换成的权限就是rwx r-x r-x,所以是:
现在知道了文件最终权限 = mode & ~umask的含义了吗?逼格太屌了。
兔年大旺 金玉满堂
linux系统编程1
1、C语言的fopen和fclose函数
#include <stdio.h>
int main()
{char ch;FILE *fp=fopen("/root/sh.txt","a");if(fp!=NULL){ fputs("i love biancheng\n",fp); }fclose(fp);printf("ok\n"); return 0;
}
使用vi编辑器创建文件write.c,然后输入上面内容,这里的代码就是C语言实现了文件的创建,采用的是a,即追加模式,不管/root/sh.txt文件有没有,有则追加,无则创建,然后向文件添加一个字符串内容i love biancheng,保存退出后,使用gcc编译,然后运行,结果如下:
文件内容写入成功,然后进行读取文件内容,vi read.c编写以下代码
#include <stdio.h>
int main()
{char str[101];FILE *fp=fopen("/root/sh.txt","r");if(fp!=NULL){ while(fgets(str,100,fp)!=NULL){printf("%s",str);}}fclose(fp);printf("ok\n"); return 0;
}
这里的代码就是打开上面创建的文件,然后以字符串读取内容并输出,最后关闭,编译,执行,效果如下:
2、系统调用
什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface, API)。是应用程序同系统之间数据交互的桥梁。
C 标准函数和系统函数调用关系。一个 helloworld 如何打印到屏幕
c库函数与系统函数的关系
3、Linux系统的open和close函数
1、open函数创建及打开文件
系统调用提供了open函数,open函数在打开不存在的文件时候允许创建,同时提供了两种实现方式,这两种区别在于创建的文件是否可以写入指定权限。
1.open函数原型:int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
2.参数1:const char *pathname,该文件路径;
参数2:int flags, 打开文件的三种模式O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写),三者选其一,另外,选择以上其中一个参数后还可以选以下参数:
O_CREAT 若文件不存在则创建它。使用此选项时,需同时说明参数3mode,其
说明该新文件的存取许可权限;
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则返回-1;
O_APPEND 每次写时都加到文件尾端;
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或者
只写成功打开,则将其长度截短为0。
3.返回值:如果文件成功创建或打开则返回文件对应的文件描述符(大于0的整数),否则返
回-1。(其中linux系统中默认0-标准输入,1-标准输出,2-标准错误)
4.包含特定头文件:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
1.1普通打开
函数 | int open(char *pathname, int flags) |
参数 | pathname:要打开的文件路径名 flags:文件打开方式,O_RDONLY(可读), O_WRONLY(可写), O_RDWR(可读可写) |
返回值 | 成功: 打开文件所得到对应的文件描述符(整数)失败: -1, 设置errno |
体验一下,用vi open.c,输入以下代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{int fd; fd=open("/root/sh.txt",O_RDONLY);if(fd==-1){printf("fd=%d,fail\n",fd); }else{printf("fd=%d,success\n",fd); } return 0;
}
gcc编译执行,结果如下:
1.2 指定权限打开
函数 | int open(char *pathname, int flags, mode_t mode) |
参数 | pathname:要打开的文件路径名 flags:文件打开方式 O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK… mode:参数3使用的前提, 参数2指定了 O_CREAT,取值8进制数,用来描述文件的访问权限,如: rwx 0664,创建文件最终权限 = mode & ~umask |
返回值 | 成功: 打开文件所得到对应的文件描述符(整数) 失败: -1, 设置errno |
第3个参数mode_t mode的权限设置用的八进制处理,详细对照表:
体验一下,用vi open2.c,输入以下代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{int fd; fd=open("/root/sh2.txt",O_RDONLY);if(fd==-1){ printf("fd=%d,fail\n",fd);fd=open("/root/sh2.txt",O_CREAT,0777);if(fd!=-1){printf("fd=%d,success\n",fd);}} return 0;
}
gcc编译通过,执行,效果如下:
发现一个问题了吧,代码中指定权限是777,为何最后权限是755?代码中指定权限是777,为何最后权限是755?其中奥秘是:创建文件最终权限 = mode & ~umask。
1、umask详解
umask(user file-creatiopn mode mask)是linux中的一个命令,用于为用户文件创建权限掩码,语法“umask [-S][权限掩码]”;其中,“权限掩码”是由3个八进制的数字所组成,查看umask 命令为: umask,
2、mode & ~umask详解
~umask的意思是将umask取反,0022是8进制,要转成2进制,根据
0022转成2进制是将每个8进制的数都要用3位的2进制表示,即8进制的2转成2进制是010,所以0022转成2进制是000000010010,~就是取反操作,000000010010取反就是111111101101,同时在上面例子中,设置的mode是0777,换成2进制是000111111111,&是与运算,01=0,11=1,所以最终权限 = mode & ~umask,即
000 111 111 111
111 111 101 101
&的结果是:000 111 101 101,111是7,101是5,最后就是0755,即755,而755换成的权限就是rwx r-x r-x,所以是:
现在知道了文件最终权限 = mode & ~umask的含义了吗?逼格太屌了。
兔年大旺 金玉满堂