博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux sync命令到底做了什么(结合项目中遇到的问题)
阅读量:4166 次
发布时间:2019-05-26

本文共 3366 字,大约阅读时间需要 11 分钟。

很久前保存的一片文章, 不清楚具体出处了.

[cpp] 
 
  1. /* sync - update the super block 
  2.    Copyright (C) 1994-2004 Free Software Foundation, Inc. 
  3.  
  4.    This program is free software; you can redistribute it and/or modify 
  5.    it under the terms of the GNU General Public License as published by 
  6.    the Free Software Foundation; either version 2, or (at your option) 
  7.    any later version. 
  8.  
  9.    This program is distributed in the hope that it will be useful, 
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  12.    GNU General Public License for more details. 
  13.  
  14.    You should have received a copy of the GNU General Public License 
  15.    along with this program; if not, write to the Free Software Foundation, 
  16.    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */  
  17.   
  18. /* Written by Jim Meyering */  
  19.   
  20. #include <config.h>  
  21. #include <getopt.h>  
  22. #include <stdio.h>  
  23. #include <sys/types.h>  
  24.   
  25. #include "system.h"  
  26. #include "error.h"  
  27. #include "long-options.h"  
  28.   
  29. /* The official name of this program (e.g., no `g' prefix). */  
  30. #define PROGRAM_NAME "sync"  
  31.   
  32. #define AUTHORS "Jim Meyering"  
  33.   
  34. /* The name this program was run with. */  
  35. char *program_name;  
  36.   
  37. void  
  38. usage (int status)  
  39. {  
  40. if (status != EXIT_SUCCESS) //EXIT_SUCCESS是个宏定义,在linux系统中被定义成0,代表成功退出状态  
  41.     fprintf (stderr, _("Try `%s --help' for more information.\n"),  
  42.          program_name);//fprintf接受的第一个参数是输出的目的地,这是个FILE * 类型的流  
  43.          //后面的参数是格式化输出,类似printf了,不知道这个加了下划线和括号的语法是何物?  
  44.          //第三个参数是对应%s的  
  45. else //如果usage接收到的整型类型形参status等于宏EXIT_SUCCESS,则执行下面的语句块  
  46.     {  
  47.     //这段语句块也是一系列的输出,解释一下fputs吧,第一个参数是指向字符类型的指针,第二个参数是目的地流  
  48.       printf (_("Usage: %s [OPTION]\n"), program_name);//输出类似: Usage: sync [OPTION]  
  49.       fputs (_("\  
  50. Force changed blocks to disk, update the super block.\n\  
  51. \n\  
  52. "), stdout);//向标准输出,输出一串字符串  
  53.       fputs (HELP_OPTION_DESCRIPTION, stdout);//是在System.h中定义的宏,其值为:  
  54.       // _("      --help     display this help and exit\n")  
  55.       fputs (VERSION_OPTION_DESCRIPTION, stdout);//同上,也是个宏  
  56.       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);//PACKAGE_BUGREPORT这个宏定义没有找到,估计是在lib下面的头文件里定义的。  
  57.     }  
  58. exit (status); //最后函数的返回值是传入的形参status的值  
  59. }  
  60.   
  61. int  
  62. main (int argc, char **argv) //标准的main函数  
  63. {  
  64. initialize_main (&argc, &argv);//应该是为了兼容posix标准而调的在System.h里面定义的一个宏,我查看了预编译后的实际代码,  
  65. //结果是个空语句,说明其实没有什么用处,估计开源的程序都这样写,而在非linux平台,像System.h里面的initialize_main宏,应该有定义。  
  66. program_name = argv[0];//给全局字符指针变量program_name赋值,我看很多程序都这样做,估计这应该是标准做法  
  67. setlocale (LC_ALL, "");//意思是将整个locale设置为实现相关的本地环境,有点拗口,我理解就是恢复locale为本地的默认环境  
  68. bindtextdomain (PACKAGE, LOCALEDIR);  
  69. textdomain (PACKAGE);//这两句也是在System.h里面定义的宏,预编译后也是空语句,标准做法  
  70.   
  71. atexit (close_stdout);//当这个程序(main函数)正常结束后,close_stdout被调用,看看man,对atexit等函数解释的相当到位了,不过我没有找到close_stdout的定义  
  72.   
  73. parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,  
  74.               usage, AUTHORS, (char const *) NULL);  
  75. /* 
  76. parse_long_options函数在lib目录下的long-options.h头文件中被定义,估计这也是个标准的做法 
  77.  
  78. */  
  79. if (getopt_long (argc, argv, "", NULL, NULL) != -1)  
  80.    /* 
  81.    getopt_long函数是在头文件getopt.h中定义的,如果没有参数,则函数返回-1 
  82.  
  83.    */  
  84.     usage (EXIT_FAILURE);//没有参数,打印帮助,提示看--help  
  85.   
  86. if (optind < argc)//optind是传递给main函数的argv里的第一个不是选项参数的下标,如果这个下标比命令行参数个数还小  
  87.     error (0, 0, _("ignoring all arguments"));//则调用error函数,传递了3个参数  
  88.   
  89. sync ();//调用函数sync  
  90. /* 
  91. 看到这里,说实话挺失望的,本来以为能看到具体怎么把块进行刷新到磁盘上的呐,结果这个程序 
  92. 竟然是调用是系统调用sync,查<apue>也证实了这一点,apue的第62页写道: 
  93. 命令sync(1)也调用sync函数。 
  94. 值得注意的是sync函数只是将所有修改过的块缓冲区排入写队列,然后它就返回,它并不等待实际写 
  95. 磁盘操作结束,幸运的是,通常成为update的系统守护进程会周期(30s)调用sync函数,这就保证了 
  96. 定期冲洗内核的块缓冲区,所以我们在linux上更新一个文件后,不要着急重启服务器,最好等待 
  97. 实际的磁盘写操作完成,避免数据丢失。 
  98. */  
  99. exit (EXIT_SUCCESS);//最后返回成功执行的状态码。  
  100. }  
  101.   
  102.   

转载地址:http://uzexi.baihongyu.com/

你可能感兴趣的文章
编码套路的实战演练
查看>>
剖析工作问题,提高码农效率
查看>>
python3.2官方文档教程--模块
查看>>
java架构师之路:JAVA程序员必看的15本书的电子版下载地址
查看>>
码农提高工作效率
查看>>
程序员不可不知的eclipse操作快捷键
查看>>
Java程序员应该常思考的问题
查看>>
Java程序员进阶必练题
查看>>
Python3.2官方文档教程--深入模块
查看>>
Python3.2官方文档教程---格式化输出
查看>>
Python3.2 官方文档翻译--错误与异常
查看>>
Python3.2官方文档翻译--异常处理
查看>>
用Java实现按字节长度截取字符串
查看>>
Python3.2官方文档翻译--清理动作
查看>>
Python3.2官方文档翻译--异常抛出和自定义异常
查看>>
一道于心不甘的编程题
查看>>
迷宫问题的研究与实现
查看>>
快速比较两个字符串中字符完全相同(兄弟字符串比较)
查看>>
Python3.2官方文档翻译--类总介绍
查看>>
Python3.2官方文档翻译--名称和对象相关术语
查看>>