linux sync命令到底做了什么

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

/* sync - update the super block
   Copyright (C) 1994-2004 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */

/* Written by Jim Meyering */

#include <config.h>
#include <getopt.h>
#include <stdio.h>
#include <sys/types.h>

#include "system.h"
#include "error.h"
#include "long-options.h"

/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "sync"

#define AUTHORS "Jim Meyering"

/* The name this program was run with. */
char *program_name;

void
usage (int status)
{
if (status != EXIT_SUCCESS) //EXIT_SUCCESS是个宏定义,在linux系统中被定义成0,代表成功退出状态
    fprintf (stderr, _("Try `%s --help' for more information.\n"),
         program_name);//fprintf接受的第一个参数是输出的目的地,这是个FILE * 类型的流
         //后面的参数是格式化输出,类似printf了,不知道这个加了下划线和括号的语法是何物?
         //第三个参数是对应%s的
else //如果usage接收到的整型类型形参status等于宏EXIT_SUCCESS,则执行下面的语句块
    {
    //这段语句块也是一系列的输出,解释一下fputs吧,第一个参数是指向字符类型的指针,第二个参数是目的地流
      printf (_("Usage: %s [OPTION]\n"), program_name);//输出类似: Usage: sync [OPTION]
      fputs (_("\
Force changed blocks to disk, update the super block.\n\
\n\
"), stdout);//向标准输出,输出一串字符串
      fputs (HELP_OPTION_DESCRIPTION, stdout);//是在System.h中定义的宏,其值为:
      // _("      --help     display this help and exit\n")
      fputs (VERSION_OPTION_DESCRIPTION, stdout);//同上,也是个宏
      printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);//PACKAGE_BUGREPORT这个宏定义没有找到,估计是在lib下面的头文件里定义的。
    }
exit (status); //最后函数的返回值是传入的形参status的值
}

int
main (int argc, char **argv) //标准的main函数
{
initialize_main (&argc, &argv);//应该是为了兼容posix标准而调的在System.h里面定义的一个宏,我查看了预编译后的实际代码,
//结果是个空语句,说明其实没有什么用处,估计开源的程序都这样写,而在非linux平台,像System.h里面的initialize_main宏,应该有定义。
program_name = argv[0];//给全局字符指针变量program_name赋值,我看很多程序都这样做,估计这应该是标准做法
setlocale (LC_ALL, "");//意思是将整个locale设置为实现相关的本地环境,有点拗口,我理解就是恢复locale为本地的默认环境
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);//这两句也是在System.h里面定义的宏,预编译后也是空语句,标准做法

atexit (close_stdout);//当这个程序(main函数)正常结束后,close_stdout被调用,看看man,对atexit等函数解释的相当到位了,不过我没有找到close_stdout的定义

parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,
              usage, AUTHORS, (char const *) NULL);
/*
parse_long_options函数在lib目录下的long-options.h头文件中被定义,估计这也是个标准的做法

*/
if (getopt_long (argc, argv, "", NULL, NULL) != -1)
   /*
   getopt_long函数是在头文件getopt.h中定义的,如果没有参数,则函数返回-1

   */
    usage (EXIT_FAILURE);//没有参数,打印帮助,提示看--help

if (optind < argc)//optind是传递给main函数的argv里的第一个不是选项参数的下标,如果这个下标比命令行参数个数还小
    error (0, 0, _("ignoring all arguments"));//则调用error函数,传递了3个参数

sync ();//调用函数sync
/*
看到这里,说实话挺失望的,本来以为能看到具体怎么把块进行刷新到磁盘上的呐,结果这个程序
竟然是调用是系统调用sync,查<apue>也证实了这一点,apue的第62页写道:
命令sync(1)也调用sync函数。
值得注意的是sync函数只是将所有修改过的块缓冲区排入写队列,然后它就返回,它并不等待实际写
磁盘操作结束,幸运的是,通常成为update的系统守护进程会周期(30s)调用sync函数,这就保证了
定期冲洗内核的块缓冲区,所以我们在linux上更新一个文件后,不要着急重启服务器,最好等待
实际的磁盘写操作完成,避免数据丢失。
*/
exit (EXIT_SUCCESS);//最后返回成功执行的状态码。
}


    从21点开始看,用了竟然是1个半小时才看完这100行的程序,查阅了《c和指针》《apue》和google,查setlocale、sync系统调用,
EXIT_SUCCESS宏等,量虽然少了点,总算是看了一个我经常使用的命令的源码了,呵呵。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux中的sync命令是用来将缓存中的数据写入磁盘的工具。它可以确保数据在系统崩溃或断电时不会丢失。sync命令可以在系统运行时执行,也可以在系统关机前执行。 当我们在Linux系统中修改文件时,系统会将修改后的数据存储在内存缓存中,而不是直接写入磁盘。这是因为将数据写入磁盘需要时间,而将数据存储在内存中可以提高系统的性能。但是,如果系统崩溃或断电,这些数据就会丢失。为了避免这种情况,我们可以使用sync命令将缓存中的数据写入磁盘。 sync命令的使用非常简单,只需要在终端中输入sync即可。执行sync命令后,系统会将缓存中的数据写入磁盘,并在完成后返回一个提示信息。 总之,sync命令Linux系统中非常重要的一个命令,它可以确保数据的安全性,避免数据丢失的情况发生。 ### 回答2: Linux系统中有一个非常有用的命令——sync命令。这个命令能够帮助用户实现对硬件设备中的数据进行同步的操作。该命令主要用于将所有的数据都写入到文件系统中,并将这些数据从文件缓存中清除出去,以便确保磁盘中的数据与文件系统同步。 在linux系统中,文件系统是由文件和目录构成的一个树形结构,而缓存是用于存储从磁盘中读取出来的数据的一种临时存储器。因此,在使用文件系统中的文件时,可能会出现数据丢失或不一致的情况。为了避免这些问题的出现,用户需要使用sync命令sync命令通常会在两种情况下使用: 1. 当用户进行重要操作时,比如更改文件系统的大小或者在文件系统中进行了重要文件的操作,需要使用sync来把数据同步到磁盘中,确保操作的成功。 2. 在用户进行系统关闭或者重启时,需要使用sync来把已经将缓存中的数据同步到磁盘中,防止数据丢失或不一致的情况出现。 总之,sync命令可以帮助用户确保数据的完整性和一致性,避免数据的不可恢复性丢失,是linux系统中非常重要的一个命令。 ### 回答3: Linux中的sync命令是一个非常重要的命令,在系统维护中经常会用到。sync命令是用来将内存缓存中尚未写入磁盘的数据全部写入磁盘中的,从而保证了数据的完整性。sync命令可以确保磁盘中的文件与内存中的数据一致,防止数据的丢失或损坏。 当文件被修改、创建或删除时,文件系统不会立即将这些更改写入磁盘。相反,文件系统内存缓存中会保留这些更改,以便在之后更有效地进行读写操作。但是,如果系统崩溃或出现问题,内存缓存中的数据将丢失并导致数据的损坏。因此,sync命令的使用显得尤为重要。 sync命令的执行很快,但是必须注意的是,在执行过程中,操作系统会暂停所有的I/O操作,直到所有的数据都被写入磁盘为止。这意味着当你执行sync命令时,系统会变得非常缓慢,直到同步操作完成。 sync命令的语法非常简单,只需要在终端输入sync即可执行。通常,我们在进行系统备份、系统更新、重启或关闭时都会使用sync命令来确保数据的完整性。 总的来说,sync命令是一个强大、有用的Linux命令,用于确保数据的完整性。在高可靠性、高可用性的服务器环境中,sync命令的使用尤为重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值