例1.文件io

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5.  
  6. int main(int argc, char **argv) {
  7. printf("%s\n",argv[]);
  8. int fdt,fds;
  9. char buf[];
  10. int num = ;
  11. if ((fds = open("/etc/profile",O_RDONLY)) < ) {
  12. printf("open fail\n");
  13. }
  14. if ((fdt = open(argv[],O_CREAT|O_TRUNC|O_RDWR) < ) {
  15. printf("open fail\n");
  16. return ;
  17. }
  18. while () {
  19. if ((num = read(fds,buf,)) < ) {
  20. printf("read fail\n");
  21. }
  22. if (write(fdt,buf,num) < ) {
  23. printf("write fail\n");
  24. return ;
  25. }
  26. if (num != ) {
  27. break;
  28. }
  29. }
  30. close(fds);
  31. close(fdt);
  32. return ;
  33. }

① 这些常数的定义,在/usr/include/bits/fcntl.h

  1. #define O_ACCMODE 0003
  2. #define O_RDONLY 00
  3. #define O_WRONLY 01
  4. #define O_RDWR 02
  5. #define O_CREAT 0100 /* not fcntl */
  6. #define O_EXCL 0200 /* not fcntl */
  7. #define O_NOCTTY 0400 /* not fcntl */
  8. #define O_TRUNC 01000 /* not fcntl */
  9. #define O_APPEND 02000
  10. #define O_NONBLOCK 04000
  11. #define O_NDELAY O_NONBLOCK
  12. #define O_SYNC 010000
  13. #define O_FSYNC O_SYNC
  14. #define O_ASYNC 020000

可以看出,每个常数都对应一位。所以按位或得到的值,每多或上一个常数,就是把对应的一位置1。

O_TRUNCopen()应首先删除文件中的内容,然后开始编写。
file.txt中包含ASCII '11',它应该做的是读取它并将其覆盖为'8',文件最终为'8'。
代码的目标是读取文件中的数字,将其减3,然后仅使用系统调用将该数字放回文件中。

  1. #include <unistd.h>
  2. #include <fcntl.h>
  3.  
  4. int main(int argc, char*argv[]){
  5.  
  6. int fp = open("file.txt", O_RDONLY);
  7. char c1, c2, c3='\n';
  8.  
  9. read(fp, &c1, );
  10. read(fp, &c2, );
  11. close(fp);
  12. fp = open("file.txt", O_TRUNC | O_WRONLY);
  13.  
  14. if (c2 == '\n')
  15. c1 -= ;
  16. else {
  17. if (c2 >= '' && c2 <= '' ) {
  18. c1--;
  19. c2 += ;
  20. }
  21. else
  22. c2 -= ;
  23.  
  24. }
  25. if (c1 != '')
  26. write(fp,&c1,);
  27. if (c2 != '\n')
  28. write(fp,&c2,);
  29. write(fp,&c3,);
  30. return ;
  31. }:

参考:https://stackoverflow.com/questions/49040262/o-trunc-in-system-call-open-not-actually-deleting-contents-of-file

  1. void open (const char* filename,
  2. ios_base::openmode mode = ios_base::in | ios_base::out);

对filename进行后面的操作组合

参考:http://www.cplusplus.com/reference/fstream/basic_fstream/open/

例程的功能是将 /etc/profile 文件每20个字节进行读取到 arg[1] (没有则重新创建,有则进行内容覆盖)文件中。

例2.进程间通信

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. int main(int argc, char **argv) {
  9. int pipe_fd[];
  10. pid_t pid;
  11. char buf_r[];
  12.  
  13. char* p_wbuf = "hello world!";
  14. int r_num = ; memset(buf_r, , sizeof(buf_r));
  15.  
  16. if (pipe(pipe_fd) < ) {
  17. printf("pipe create error\n");
  18. return -;
  19. }
  20. if ((pid = fork()) == ) {
  21. close(pipe_fd[]);
  22. sleep();
  23. if ((r_num = read(pipe_fd[], buf_r, )) > ) {
  24. printf("%d numbers read from the pipe is \" %s \"\n", r_num, buf_r);
  25. }
  26. close(pipe_fd[]);
  27. exit();
  28. }
  29. else if (pid > ) {
  30. close(pipe_fd[]);
  31. if (write(pipe_fd[], p_wbuf, strlen(p_wbuf)) != -) {
  32. printf("parent write \" %s \" success!\n", p_wbuf);
  33. }
  34. close(pipe_fd[]);
  35. sleep();
  36. waitpid(pid, NULL, );
  37. exit();
  38. }
  39.  
  40. }

  1. void * memset ( void * ptr, int value, size_t num );
    ptr指的内存的num个字节用value设置set
  1. /* memset example */
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main ()
  6. {
  7. char str[] = "almost every programmer should know memset!";
  8. memset (str,'-',);
  9. puts (str);
  10. return ;
  11. }

Output:

  1. ------ every programmer should know memset!

pipe(filedes)的功能: 建立一无名管道。管道建立后,写进程将数据写入文件 filedes[1],读进程 从文件 filedes[0]中读数据,从而实现读/写进程的管道通信。

例程的功能是将p_wbuf指向的100个内存单元通过pipe传给buf_r[100]。

『Shell编程』学习记录(2)的更多相关文章

  1. 『Shell编程』学习记录(1)

    例1. $ cat ex1 date pwd cd .. $ bash ex1 # 运行,显示当前日期和当前目录,但没有执行返回上级目录,因为执行的时候终端会产生一个子shell(类似于C语言调用函数 ...

  2. 『C编程』学习笔记(1)

    size_t类型详解: #include <cstddef> #include <iostream> #include <array> int main() { s ...

  3. Linux 与 unix shell编程指南——学习笔记

    第一章    文件安全与权限 文件访问方式:读,写,执行.     针对用户:文件属主,同组用户,其它用户.     文件权限位最前面的字符代表文件类型,常用的如         d 目录:l 符号链 ...

  4. linux shell编程进阶学习(转)

    第一节:基础 ls -lh  ——可以用户友好的方式看到文件大小 file 文件名 ——查看文件类型 stat 文件名 ——查看文件当前状态 man 命令/函数名 ——查看详细的帮助文档 man中看某 ...

  5. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  6. Linux Unix shell 编程指南学习笔记(第三部分)

    第十三章  登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...

  7. 《灰帽Python-黑客和逆向工程师的Python编程》学习记录

    ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书 ...

  8. android adb shell and monkey 学习记录

    Monkey环境: android SDK and JDK SDK目录下的platform-tools和tools目录要配置环境变量 查看版本: ADB 的安装这里就不多说了,输入以下命令有如下提示就 ...

  9. Linux Unix shell 编程指南学习笔记(第四部分)

    第十六章  shell脚本介绍 此章节内容较为简单,跳过. 第十七章   条件測试 test命令 expr命令 test  格式  test  condition     或者  [ conditio ...

随机推荐

  1. traefik 结合 docker-compose 的快速安装及使用

    traefik 介绍 traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理.负载均衡工具. 它支持多种后台 (Docker, Swarm, Kubernetes, Maratho ...

  2. js 原型,原型链,原型链继承浅析

    对于网上的关于原型,原型链和原型链继承的晦涩语言说明就不累赘了,复制粘贴过来再解释一遍怕自己也整蒙了,本人最怕空气突然安静,四目对视,大眼对小眼,一脸懵逼. 我们先看下面

  3. RFID和QRCODE对比

    1.技术介绍 1.1 RFID 射频识别,RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而 ...

  4. python3 完全理解赋值,浅copy,深copy 通过地址详细理解~

    额...老规矩,先来一天NLP再说,也没几条了. 十,在任何一个系统里,最灵活的部分是最能影响大局的部分 灵活便是有一个以上的选择,选择便是能力,因此最灵活的人便是最有能力的人. 灵活来自减少只相信自 ...

  5. [计算机视觉]100行python实现摄像机偏移、抖动告警

    背景 在实际项目中,利用深度学习在检测道路车辆并分析车辆行为时,需要按照事先规定的方法绘制检测区(包含道路方向.车道区域等).由于各种原因(人为.天气),获取视频数据的摄像角度容易偏移原来设定的位置, ...

  6. notepad++ 快速运行PHP代码

    notepad++ 运行PHP代码 1. 按下快捷键 F52. 将输入如下命令 cmd /k D:\xampp\php\php.exe "$(FULL_CURRENT_PATH)" ...

  7. Linux常用命令速查-汇总篇

    Linux常用命令速查-用户管理 Linux常用命令速查-文件管理 Linux常用命令速查-系统监控 Linux常用命令速查-网络管理 Linux常用命令速查-定时任务 Linux常用命令速查-Vim

  8. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  9. 《HelloGitHub》第 29 期

    公告 月刊现已支持 RSS 订阅 <HelloGitHub>第 29 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. ...

  10. 『集群』005 Slithice 基于 集群 的 自动容错

    Slithice 基于 集群 的 自动容错 Slithice容错概述: Slithice 支持 非集群 的 独立服务端: 支持 基于 中央服务器 的 集群服务端: 支持 基于 自定义配置 的 集群服务 ...