当前位置: 首页 > news >正文

给视频做特效的网站做ppt很有创意的网站

给视频做特效的网站,做ppt很有创意的网站,建筑公司企业愿景与使命,中国网站建设哪家公司好【Linux基础IO篇】系统文件接口#xff08;1#xff09; 目录 【Linux基础IO篇】系统文件接口#xff08;1#xff09;回顾C语言的文件接口系统文件I/Oopen接口的介绍 open函数返回值文件描述符fd#xff08;小整数#xff09;文件描述符的分配规则 重定向dup2系统调用改…【Linux基础IO篇】系统文件接口1 目录 【Linux基础IO篇】系统文件接口1回顾C语言的文件接口系统文件I/Oopen接口的介绍 open函数返回值文件描述符fd小整数文件描述符的分配规则 重定向dup2系统调用改进myshell添加重定向功能 作者爱写代码的刚子 时间2023.11.1 前言本篇博客是关于C语言文件接口的回顾以及学习在Linux系统下关于文件的系统调用接口。 回顾C语言的文件接口 在本篇博客不详细介绍可以参考我之前写的一篇博客 文件操作有关知识 注意C默认会打开三个输入输出流分别是stdinstdoutstderr这三个流类型都是FILE* fopen返回值类型文件指针 系统文件I/O 用系统接口模拟上面的文件接口 写入文件 读取文件 open接口的介绍 pathname要打开或者要创建的目标文件 flag打开文件时可以传入多个参数选项用一个或多个常量进行’或’运算构成flags 参数 O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读写打开 这三个常量必须指定一个且只能指定一个 O_CREAT : 若文件不存在则创建它。需要使用mode选项来指明新文件的访问权限O_APPEND: 追加写O_TRUNC:将文件原本的内容全部丢弃文件大小变为0。 返回值 成功新打开的文件描述符失败-1 我们可以参照flags参数的形式自己编写一个类似效果的代码 #define ONE (10) // 1 #define TWO (11) // 2 #define THREE (12) // 4 #define FOUR (13) // 8void show(int flags) {if(flagsONE) printf(hello function1\n);if(flagsTWO) printf(hello function2\n);if(flagsTHREE) printf(hello function3\n);if(flagsFOUR) printf(hello function4\n); }int main() {printf(-----------------------------\n);show(ONE);printf(-----------------------------\n);show(TWO);printf(-----------------------------\n);show(ONE|TWO);printf(-----------------------------\n);show(ONE|TWO|THREE);printf(-----------------------------\n);show(ONE|THREE);printf(-----------------------------\n);show(THREE|FOUR);printf(-----------------------------\n); }注意使用第三个函数参数mode_t mode时需要考虑当前的权限掩码如果需要屏蔽权限掩码则需要将当前进程的掩码设为0umask(0); st_mode也用到了mode_t类型的变量. open 函数具体使用哪个和具体应用场景相关如目标文件不存在需要open创建则第三个参数表示创建文件的默权限。 write、read、close、lseek类比C文件相关接口 open函数返回值 系统调用和库函数C语言中的库函数对系统调用接口进行了一系列封装如fopen、fclose、fread、fwrite统称为库函数libc 而open、close、read、write、lseek都属于系统调用接口 f#系列的函数都是对系统调用函数的封装。 文件描述符fd小整数 0 1 2 Linux进程默认情况下会有3个缺省打开的文件描述符分别是标准输入0 标准输出1 标准错误2. 0,1,2对应的物理设备一般是:键盘显示器显示器 文件描述符就是从0开始的小整数。当我们打开文件时操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组每个元素都是一个指向打开文件的指针!所以本质上文件描述符就是该数组的下标。所以只要拿着文件描述符就可以找到对应的文件 文件描述符的分配规则 实验(图片中的perror中的内容应该为open当时写错了) 以上图片中我们关闭了显示器一号文件再打开test.c运行程序 以上结果中我们发现本来应该要向显示器显示的数据却打印到了文件中说明新打开的文件将1作为了当前文件的文件描述符 结论在files_struct数组中找到当前没有被使用的最小的一个下标作为新的文件描述符。 重定向 将本来应该输出到显示器的文件写入到文件中 此时我们发现本来应该输出到显示器上的内容输出到了文件test1.c当中其中fd1。这种现象叫做输出重定向。常见的重定向、、 重定向本质: dup2系统调用 解释为什么’\n’不能刷新缓冲区而是必须使用fflush函数手动刷新 标准输出它本身是行缓冲本来反斜杠N可以刷新但是现在把它重定向到另外一个文件当中了但普通文件是全缓冲行缓冲就不生效了所以说’\n‘就没用flush是把它重新再刷新一下全部的缓冲区就能刷出来了。 printf是C库当中的IO函数一般往 stdout 中输出但是stdout底层访问文件的时候找的还是fd:1, 但此时fd:1 下标所表示内容已经变成了myfile的地址不再是显示器文件的地址所以输出的任何消息都会往文件中写 入进而完成输出重定向。 改进myshell添加重定向功能 #include stdio.h #include stdlib.h #include string.h #include assert.h #include unistd.h #include stdlib.h #include sys/types.h #include sys/wait.h #include ctype.h #include fcntl.h#define LEFT [ #define RIGHT ] #define LABLE # #define DELIM \t #define LINE_SIZE 1024 #define ARGC_SIZE 32 #define EXIT_CODE 44#define NONE -1 #define IN_RDIR 0 #define OUT_RDIR 1 #define APPEND_RDIR 2int lastcode 0; int quit 0; extern char **environ; char commandline[LINE_SIZE]; char *argv[ARGC_SIZE]; char pwd[LINE_SIZE]; char *rdirfilename NULL; int rdir NONE;// 自定义环境变量表 char myenv[LINE_SIZE]; // 自定义本地变量表const char *getusername() {return getenv(USER); }const char *gethostname1() {return getenv(HOSTNAME); }void getpwd() {getcwd(pwd, sizeof(pwd)); }void check_redir(char *cmd) {// ls -al -n// ls -al -n // filename.txtchar *pos cmd;while(*pos){if(*pos ){if(*(pos1) ){*pos \0;*pos \0;while(isspace(*pos)) pos;rdirfilename pos;rdirAPPEND_RDIR;break;}else{*pos \0;pos;while(isspace(*pos)) pos;rdirfilename pos;rdirOUT_RDIR;break;}}else if(*pos ){*pos \0; // ls -a -l -n filename.txtpos;while(isspace(*pos)) pos;rdirfilename pos;rdirIN_RDIR;break;}else{//do nothing}pos;} }void interact(char *cline, int size) {getpwd();printf(LEFT%s%s %sRIGHTLABLE , getusername(), gethostname1(), pwd);char *s fgets(cline, size, stdin);assert(s);(void)s;// abcd\n\0cline[strlen(cline)-1] \0;//ls -a -l myfile.txtcheck_redir(cline); }int splitstring(char cline[], char *_argv[]) {int i 0;argv[i] strtok(cline, DELIM);while(_argv[i] strtok(NULL, DELIM)); // 是不是return i - 1; }void NormalExcute(char *_argv[]) {pid_t id fork();if(id 0){perror(fork);return;}else if(id 0){int fd 0;// 做了重定向的工作后面在进行程序替换的时候并不影响if(rdir IN_RDIR){fd open(rdirfilename, O_RDONLY);dup2(fd, 0);}else if(rdir OUT_RDIR){fd open(rdirfilename, O_CREAT|O_WRONLY|O_TRUNC, 0666);dup2(fd, 1);}else if(rdir APPEND_RDIR){fd open(rdirfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);dup2(fd, 1);}//让子进程执行命令//execvpe(_argv[0], _argv, environ);execvp(_argv[0], _argv);exit(EXIT_CODE);}else{int status 0;pid_t rid waitpid(id, status, 0);if(rid id) {lastcode WEXITSTATUS(status);}} }int buildCommand(char *_argv[], int _argc) {if(_argc 2 strcmp(_argv[0], cd) 0){chdir(argv[1]);getpwd();sprintf(getenv(PWD), %s, pwd);return 1;}else if(_argc 2 strcmp(_argv[0], export) 0){strcpy(myenv, _argv[1]);putenv(myenv);return 1;}else if(_argc 2 strcmp(_argv[0], echo) 0){if(strcmp(_argv[1], $?) 0){printf(%d\n, lastcode);lastcode0;}else if(*_argv[1] $){char *val getenv(_argv[1]1);if(val) printf(%s\n, val);}else{printf(%s\n, _argv[1]);}return 1;}// 特殊处理一下lsif(strcmp(_argv[0], ls) 0){_argv[_argc] --color;_argv[_argc] NULL;}return 0; }int main() {while(!quit){// 1.rdirfilename NULL;rdir NONE;// 2. 交互问题,获取命令行, ls -a -l myfile / ls -a -l myfile / cat file.txtinteract(commandline, sizeof(commandline));// commandline - ls -a -l -n\0 - ls -a -l -n// 3. 子串分割的问题解析命令行int argc splitstring(commandline, argv);if(argc 0) continue;// 4. 指令的判断 // debug//for(int i 0; argv[i]; i) printf([%d]: %s\n, i, argv[i]);//内键命令本质就是一个shell内部的一个函数int n buildCommand(argv, argc);// 5. 普通命令的执行if(!n) NormalExcute(argv);}return 0; }
http://www.lebaoying.cn/news/8141.html

相关文章:

  • 做一个门户网站要多少钱满山红网站建设公司
  • 网站建设彩票专业做化学招聘的网站有哪些
  • 锦州网站制作网站设计成品
  • 手机ui设计网站门户网站好处
  • 要如何关闭公司网站 撤销备案php和python
  • 北京西站出站口全国工程信息网
  • 颍上县建设局网站开放平台建设
  • PHP 网站搜索怎么做德阳网站建设熊掌号
  • 在哪人网站要以接it项目做信丰网站建设
  • 百度如何把网站做链接地址网站建设大作业选题
  • 义乌有什么企业网站吗wordpress免费家居主题
  • 网站站点建立开发一个app需要多少钱?
  • 虚拟物品网站制作模板网站国际互联网备案号
  • seo网站模板中国建设教育协会是个什么网站
  • 电商网站开发进度表没钱可以注册一千万的公司吗
  • svg图片做网站背景企业邮箱域名解析
  • 东莞企业网站建设方案技术博客 wordpress mou
  • 网络营销网站分析dede自定义网站地图
  • 用织梦做网站后面可以改吗企业网站开发课程培训
  • 做网站有现成的程序如何免费开网店
  • 主机做网站服务器视频网站用什么做的好
  • 什么软件做网站描述asp300源码
  • wdcp更改网站域名西城广州网站建设
  • 把网站生成app的免费平台jpress和wordpress哪个好
  • 做花语的网站学做美食的网站
  • 建筑公司网站建设网站优化关键词价格
  • 宜宾市住房和城乡建设局网站长沙有哪些网络平台公司
  • 旅游网站建设的相关报价找公司网站建设
  • 网站高级感怎么做购物网站系统文本
  • 郑州服装 网站建设电子商务网站规划与管理