• Linux Shell日期比较,数值比较和字符串比较及相关 说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较;但是把整型...

    Linux Shell日期比较,数值比较和字符串比较及相关

    说明:

    1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较;但是把整型当成字符串进行比较,0123这些数值完全可以转成ASCII码而且原本两个整型相等则变成ASCII码还是相等、不等的还是不等,所以可用于字符串的比较也可用于整型的比较。

    2. if语句中,数值比较的写法是if [ $var1 -ge $var2 ];字符串比较的写法是if [ “$var1” != “$var2” ],其中加双引号只是兼容$var2处为空的情况

    3. 在各种运算中,test命令的运算和中括号是等效的

    4. 赋值时等号两边没空格,比较或测试时运算符两边都要有空格

    5. shell默认是字符运算,如果想当数值进行运算要在前边加上expr,如:var3=`expr $var1 + $var2`

    6. shell的文件包含命令只有“.”,而且该命令只能一次包含单个文件(当然可以用*表示文件夹下所有文件)而不能包含一个文件夹;所见的!includedir和#includedir并不存在这样的命令,应该是程序自己实现的包含功能

    7. “.”在shell中执行则会影响shell的环境,但如果只在脚本中执行那只影响脚本中的环境不会影响当前shell的环境;source其实也如此。

    0.日期比较

    1)、如果把日期当成字符的话,可以按照字符相关进行比较:如下:

    if [ $date_str = $end_date ]; then
                echo "相等"
    fi

    if [ $date_str = $end_date ]; then
                echo "不相等"
    fi

    2)、换成时间戳格式再比较

    在Shell中我们可以利用date命令比较两个日期的大小,方法是先把日期转换成时间戳格式,再进行比较。
    date 的+%s可以将日期转换成时间戳格式,看下面的例子:

    #!/bin/bash
    date1="2008-4-09 12:00:00"
    date2="2008-4-10 15:00:00"
     
    t1=`date -d "$date1" +%s`
    t2=`date -d "$date2" +%s`
     
    if [ $t1 -gt $t2 ]; then
        echo "$date1 > $date2"
    elif [ $t1 -eq $t2 ]; then
        echo "$date1 == $date2"
    else
        echo "$date1 < $date2"
    fi

    1.只适用于数值的比较

    该类型操作会把两边变量当成整型进行加减运算,字符串abcd按整型运算无法进行,所以此类型不能用于字符串比较

    参数

    说明

    -eq

    等于则为真

    -ne

    不等于则为真

    -gt

    大于则为真

    -ge

    大于等于则为真

    -lt

    小于则为真

    -le

    小于等于则为真

    2.适用于字符串的比较(也可用于数值比较)

    参数

    说明

    =

    相等则为真

    !=

    不相等则为真

    3.字符串测试运算

    参数

    说明

    -z 字符串

    字符串的长度为零则为真

    -n 字符串

    字符串的长度不为零则为真

    4.文件测试运算

    参数

    说明

    -e 文件名

    如果文件存在则为真

    -r 文件名

    如果文件存在且可读则为真

    -w 文件名

    如果文件存在且可写则为真

    -x 文件名

    如果文件存在且可执行则为真

    -s 文件名

    如果文件存在且至少有一个字符则为真,即文件大小非0时为真

    -d 文件名

    如果文件存在且为目录则为真

    -f 文件名

    如果文件存在且为普通文件则为真

    -c 文件名

    如果文件存在且为字符型特殊文件则为真

    -b 文件名

    如果文件存在且为块特殊文件则为真

    参考:https://www.cnblogs.com/lsdb/p/7735533.html

               https://blog.csdn.net/swandy45/article/details/8296516

               http://blog.51cto.com/lxsym/866331

     

    展开全文
  • Linux Linux Example 复制文件 copy cp cp this.ext that.txt 移动文件 move mv mv this.txt dir/ 列出文件 dir ls ls -l 清除屏幕 cls clear clear 关闭命令窗口 exit exit exit
    命令描述 MS-DOS Linux Linux Example
    复制文件 copy cp cp this.ext that.txt
    移动文件 move mv mv this.txt dir/
    列出文件 dir ls ls -l
    清除屏幕 cls clear clear
    关闭命令窗口 exit exit exit
    显示或设置日期 date date date
    删除文件 del rm rm this.txt
    输出到控制台 echo echo echo this message
    使用简单文本
    编辑器编辑文件
    edit pico pico this.txt
    比较文件内容 fc diff diff file1 file2
    在文件中查找字符串 find grep grep “this word or phrase” this.txt
    显示命令帮助 command /? man/info man/info command
    创建目录 mkdir mkdir mkdir directory
    查看文件内容 more more/less more/less this.txt
    重命名文件 ren mv mv this.txt that.txt
    显示当前文件目录 chdir pwd
    echo $PWD
    pwd
    echo $PWD
    用相对路径改变目录 cd pathname cd pathname cd /path/to/place/
    用绝对路径改变目录 cd.. cd.. cd ../path/
    显示或设置时间 time date date
    显示网络统计信息 netstat netstat netstat -nat
    显示网络设置 ipconfig ifconfig ifconfig eth0
    打开/关闭系统服务 net start/stop service services Name start/stop services sshd restart
    DNS查询 nslookup host host -a baidu.com
    ping主机 ping ping ping -c5 baidu.com
    跟踪到指定主机的路径 tracert traceroute traceroute baidu.com
    展开全文
  • 因为需要将日志文件发送到ftp中保存,但是同一个日志文件可能存了2-3天的内容,为减少后期“因为每天存一个日志,而内容有重复”这一工作量,在发送到ftp时,检测其“修改时间差”来命名文件。 ...

     

    因为需要将日志文件发送到ftp中保存,但是同一个日志文件可能存了2-3天的内容,为减少后期“因为每天存一个日志,而内容有重复”这一工作量,在发送到ftp时,检测其“修改时间差”来命名文件。

    1. 脚本语句中if判断内不支持ftp的打开/关闭,所以不能用if+“修改时间差”来判断是否打开ftp保存文件。

    2.所以,依旧是每天保存一份,只是如果文件没修改,则保存为上一次(即修改当日的)文件名,这样不产生多个文件名不同但内容相同的文件。

    3. 曲线完成需求。

    currentDate=`date +%s`
    modifyDate=$(stat -c %Y "/iiidb/errlog/bibtemp.log.0")
    logExistTime=$(($currentDate - $modifyDate))
    logExistTime=$(($logExistTime/86400))
    
    
    put /iiidb/errlog/bibtemp.log.0 bib/bibtemp-$(date -d -${logExistTime}day '+%Y%m%d').log.0
    

     

     

    日志修改时间戳参考:

    https://www.cnblogs.com/KevinSong/p/3816981.html

    #!/bin/bash
    
    log_path=""         #此处定义你的日志文件夹路径
    expried_time=7      #此处定义你的日志过期时间,如7天
    
    function deleteLogs(){
        # 获取系统时间,所有时间格式都是秒
        local currentDate=`date +%s`
        echo "current date: " $currentDate
    
        for file in `find $1 -name "*.js_*.log"` #此处定义文件名格式,避免误删
        do
            local name=$file
            local modifyDate=$(stat -c %Y $file)
    
            #对比时间,算出日志存在时间,距离最近一次修改
            local logExistTime=$(($currentDate - $modifyDate))
            logExistTime=$(($logExistTime/86400))
            
            if [ $logExistTime -gt $expried_time ]; then
                echo "File: " $name "Modify Date: " $modifyDate + "Exist Time: " $logExistTime + "Delete: yes"
                rm -f $file
            else
                echo "File: " $name "Modify Date: " $modifyDate + "Exist Time: " $logExistTime + "Delete: no"
            fi
        done
    }
    
    deleteLogs $log_path

     

    http://www.cnblogs.com/huixuexidezhu/p/9573194.html

    Linux中日期的加减运算

     

    目录

     

    正文

    • date命令本身提供了日期的加减运算。
    • date 可以用来显示或设定系统的日期与时间。

    回到顶部

    在显示方面

    使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下: % :  打印出 %
    %n : 下一行
    %t : 跳格
    %H : 小时(00..23)
    %I : 小时(01..12)
    %k : 小时(0..23)
    %l : 小时(1..12)
    %M : 分钟(00..59)
    %p : 显示本地 AM 或 PM
    %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
    %s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
    %S : 秒(00..61)
    %T : 直接显示时间 (24 小时制)
    %X : 相当于 %H:%M:%S
    %Z : 显示时区 %a : 星期几 (Sun..Sat)
    %A : 星期几 (Sunday..Saturday)
    %b : 月份 (Jan..Dec)
    %B : 月份 (January..December)
    %c : 直接显示日期与时间
    %d : 日 (01..31)
    %D : 直接显示日期 (mm/dd/yy)
    %h : 同 %b
    %j : 一年中的第几天 (001..366)
    %m : 月份 (01..12)
    %U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
    %w : 一周中的第几天 (0..6)
    %W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
    %x : 直接显示日期 (mm/dd/yy)
    %y : 年份的最后两位数字 (00.99)
    %Y : 完整年份 (0000..9999)

    回到顶部

    在设定时间方面

    date -s //设置当前时间,只有root权限才能设置,其他只能查看。
    date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
    date -s 01:01:01 //设置具体时间,不会对日期做更改
    date -s “01:01:01 2008-05-23″ //这样可以设置全部时间
    date -s “01:01:01 20080523″ //这样可以设置全部时间
    date -s “2008-05-23 01:01:01″ //这样可以设置全部时间
    date -s “20080523 01:01:01″ //这样可以设置全部时间

    回到顶部

    时间的加减

    date +%Y%m%d         //显示现在天年月日
    date +%Y%m%d --date="+1 day"  //显示后一天的日期
    date +%Y%m%d --date="-1 day"  //显示前一天的日期
    date +%Y%m%d --date="-1 month"  //显示上一月的日期
    date +%Y%m%d --date="+1 month"  //显示下一月的日期
    date +%Y%m%d --date="-1 year"  //显示前一年的日期
    date +%Y%m%d --date="+1 year"  //显示下一年的日期

    date=`date -d -${t}day '+%Y%m%d'` //为t为前几天

    展开全文
  • Linux C++ 时间与日期

    2016-07-04 17:03:45
    linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。 time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构...
    linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒一个是用一个结构来分别存储年月日时分秒的
    time_t 这种类型就是用来存储从1970年到现在经过了多少,要想更精确一点,可以用结构struct timeval,它精确到微妙
    struct timeval
    {
        long tv_sec; /*秒*/
        long tv_usec; /*微秒*/

    };


    而直接存储年月日的是一个结构:
    struct tm
    {
        int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
        int tm_min;  /*分钟,0-59*/
        int tm_hour; /*小时, 0-23*/
        int tm_mday; /*日,即一个月中的第几天,1-31*/
        int tm_mon;  /*月, 从一月算起,0-11*/  1+p->tm_mon;
        int tm_year;  /*年, 从1900至今已经多少年*/  1900+ p->tm_year;
        int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
        int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
        int tm_isdst; /*日光节约时间的旗标*/
    };

    需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。

    可参考:http://blog.csdn.net/todd911/article/details/13288011

    即:Linux下有三种类型表示时间,秒级别的time_t,毫/微秒级别的timeval,格式化时间tm,转换关系如下;


    下面介绍一下我们常用的时间函数:
    #include <time.h>
    char *asctime(const struct tm* timeptr);

    将结构中的信息转换为真实世界的时间,以字符串的形式显示


    char *ctime(const time_t *timep);

    将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样


    double difftime(time_t time1, time_t time2);

    返回两个时间相差的秒数


    int gettimeofday(struct timeval *tv, struct timezone *tz);

    返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用


    struct tm* gmtime(const time_t *timep);

    将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针


    stuct tm* localtime(const time_t *timep);

    和gmtime类似,但是它是经过时区转的时间


    time_t mktime(struct tm* timeptr);

    将struct tm 结构的时间转换为从1970年至今的秒数


    time_t time(time_t *t);

    取得从1970年1月1日至今的秒数。


    上面是简单的介绍,下面通过实战来看看这些函数的用法:
    下载: gettime1.c
    /*gettime1.c*/
    #include <time.h>

    int main()
    {
        time_t timep;
       
        time(&timep); /*获取time_t类型的当前时间*/
        /*用gmtime将time_t类型的时间转换为struct tm类型的时间按,//没有经过时区转换的UTC时间
          然后再用asctime转换为我们常见的格式 Fri Jan 11 17:25:24 2008
        */
        printf("%s", asctime(gmtime(&timep)));
        return 0;
    }
    编译并运行:
    $gcc -o gettime1 gettime1.c
    $./gettime1
    Fri Jan 11 17:04:08 2008
    下面是直接把time_t类型的转换为我们常见的格式:
    下载: gettime2.c
    /* gettime2.c*/
    #include <time.h>

    int main()
    {
        time_t timep;
       
        time(&timep); /*获取time_t类型当前时间*/   
        /*转换为常见的字符串:Fri Jan 11 17:04:08 2008*/
        printf("%s", ctime(&timep));
        return 0;
    }
    编译并运行:
    $gcc -o gettime2 gettime2.c
    $./gettime2
    Sat Jan 12 01:25:29 2008
    我看了一本书上面说的这两个例子如果先后执行的话,两个的结果除了秒上有差别之外(执行程序需要时间),应该是一样的,可是我这里执行却发现差了很长时间按,一个是周五,一个是周六,后来我用 date 命令执行了一遍
    $date
    六 1月 12 01:25:19 CST 2008
    我发现date和gettime2比较一致, 我估计可能gettime1并没有经过时区的转换,它们是有差别的。
    下载: gettime3.c
    /*gettime3.c */
    #include <time.h>

    int main()
    {
        char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        time_t timep;
        struct tm *p;
       
        time(&timep); /*获得time_t结构的时间,UTC时间*/
        p = gmtime(&timep); /*转换为struct tm结构的UTC时间*/
        printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
        printf("%s %d:%d:%d ", wday[p->tm_wday], p->tm_hour,
            p->tm_min, p->tm_sec);
        return 0;
    }
    编译并运行:
    $gcc -o gettime3 gettime3.c
    $./gettime3
    2008/1/11 Fri 17:42:54
    从这个时间结果上来看,它和gettime1保持一致。
    下载: gettime4.c
    /*gettime4.c*/
    #include <time.h>

    int main()
    {
        char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        time_t timep;
        struct tm *p;
       
        time(&timep); /*获得time_t结构的时间,UTC时间*/
        p = localtime(&timep); /*转换为struct tm结构的当地时间*/
        printf("%d/%d/%d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
        printf("%s %d:%d:%d ", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
        return 0;
    }
    编译并运行:
    $gcc -o gettime4 gettime4.c
    $./gettime4
    2008/1/12 Sat 1:49:29
    从上面的结果我们可以这样说:

    time, gmtime, asctime 所表示的时间都是UTC时间,只是数据类型不一样,

    localtime, ctime 所表示的时间都是经过时区转换后的时间,它和你用系统命令date所表示的CST时间应该保持一致

    下载: gettime5.c
    /*gettime5.c*/
    #include <time.h>

    int main()
    {
        time_t timep;
        struct tm *p;

        time(&timep); /*当前time_t类型UTC时间*/
        printf("time():%d ",timep);
        p = localtime(&timep); /*转换为本地的tm结构的时间按*/
        timep = mktime(p); /*重新转换为time_t类型的UTC时间,这里有一个时区的转换*/ //by lizp 错误,没有时区转换, 将struct tm 结构的时间转换为从1970年至p的秒数
        printf("time()->localtime()->mktime(): %d ", timep);
        return 0;
    }
    编译并运行:
    $gcc -o gettime5 gettime5.c
    $./gettime5
    time():1200074913
    time()->localtime()->mktime(): 1200074913
    这里面把UTC时间按转换为本地时间,然后再把本地时间转换为UTC时间,它们转换的结果保持一致。
    下载: gettime6.c
    /*gettime6.c */
    #include <time.h>

    int main()
    {
        time_t timep;
        struct tm *p;

        time(&timep);  /*得到time_t类型的UTC时间*/
        printf("time():%d ",timep);
        p = gmtime(&timep); /*得到tm结构的UTC时间*/
        timep = mktime(p); /*转换,这里会有时区的转换*/ //by lizp 错误,没有时区转换, 将struct tm 结构的时间转换为从1970年至p的秒数
        printf("time()->gmtime()->mktime(): %d ", timep);
        return 0;
    }
    编译并运行:
    $gcc -o gettime6 gettime6.c
    $./gettime6
    time():1200075192
    time()->gmtime()->mktime(): 1200046392
    从 这里面我们可以看出,转换后时间不一致了,计算一下,整整差了8个小时( (1200075192-1200046392)/3600 = 8),说明mktime会把本地时间转换为UTC时间,这里面本来就是UTC时间,于是再弄个时区转换,结果差了8个小时,用的时候应该注意。

    strftime() 函数将时间格式化
    我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下:
    size_t strftime(
         char *strDest,
         size_t maxsize,
         const char *format,
         const struct tm *timeptr
    );
    我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。
    函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串 strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。
    %a 星期几的简写
    %A 星期几的全称
    %b 月分的简写
    %B 月份的全称
    %c 标准的日期的时间
    %C 年份的后两位数字
    %d 十进制表示的每月的第几天
    %D 月/天/年
    %e 在两字符域中,十进制表示的每月的第几天
    %F 年-月-日
    %g 年份的后两位数字,使用基于周的年
    %G 年分,使用基于周的年
    %h 简写的月份名
    %H 24小时制的小时
    %I 12小时制的小时
    %j 十进制表示的每年的第几天
    %m 十进制表示的月份
    %M 十时制表示的分钟数
    %n 新行符
    %p 本地的AM或PM的等价显示
    %r 12小时的时间
    %R 显示小时和分钟:hh:mm
    %S 十进制的秒数
    %t 水平制表符
    %T 显示时分秒:hh:mm:ss
    %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
    %U 第年的第几周,把星期日做为第一天(值从0到53)
    %V 每年的第几周,使用基于周的年
    %w 十进制表示的星期几(值从0到6,星期天为0)
    %W 每年的第几周,把星期一做为第一天(值从0到53)
    %x 标准的日期串
    %X 标准的时间
    %y 不带世纪的十进制年份(值从0到99)
    %Y 带世纪部分的十制年份
    %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
    %% 百分号
    如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:
    #include "time.h"
    #include "stdio.h"
    int main(void)
    {
        struct tm *ptr;
        time_t lt;
        char str[80];
        lt=time(NULL);
        ptr=localtime(<);
        strftime(str,100,"It is now %I %p",ptr);
        printf(str);
        return 0;
    }
    其运行结果为:
    It is now 4PM
    而下面的程序则显示当前的完整日期:
    #include<stdio.h>
    #include<string.h>
    #include<time.h>
    int main( void )
    {
        struct tm *newtime;
        char tmpbuf[128];
        time_t lt1;
       
    time( &lt1 );
        newtime=localtime(&lt1);
       
    strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y. ", newtime);
        printf(tmpbuf);

    return 0;
    }
    展开全文
  • 那么windows内核和linux内核在这几个模块上有哪些相同之处呢?又有哪些不同之处呢? 首先,作为os,他们的理念都是相似的。 1. 一切皆文件。 可能读写文件很好实现把,linux不管修改个什么东东其实都是在...

    首先明确操作系统的几大模块:

    1. 系统初始化

    2. 进程管理

    3. 文件系统

    4. 存储系统管理

    5. I/O管理

    那么windows内核和linux内核在这几个模块上有哪些相同之处呢?又有哪些不同之处呢?

    首先,作为os,他们的理念都是相似的。

    1. 一切皆文件。 可能读写文件很好实现把,linux不管修改个什么东东其实都是在修改文件

    2. 进程是执行的实体。  几乎对于操作系统的一切操作,都要通过进程来实现的,这个才是管理资源的真正实体。

    3. 中断。 在西电学习时,刘西洋做过这样一个比喻。一个操作系统其实就是一个主循环加中断,我觉得其实还是蛮生动的,很能突出中断对于整个操作系统的意义。

    下面,对于windowslinux做一个简单的评析,以及提出一些在面试中遇到的问题,估计也是实际开发中的问题,内核之间肯定还是有不小区别的。

    定位:windows vs linux

         众所周知,windows是商用系统,面向大众的。既然是商用的,商用的很大一个特点就是向后兼容。而linux是开源系统,内核之间的升级很多时候并不兼容,主要是为了加入更多更新的东西把,但是升级真的很麻烦。

         其次,windows只是pc领域的霸主,而linux在设计之初,很多时候是针对服务器的。这个也导致了他们在实现的很多区别。

    系统初始化: 

    略。不是很关键吧。但是实现过程都应该差不多,有兴趣大家可以去查下。

    进程管理:fork+exevc vs createProcess

    Linux的进程创建函数?当然是fork了。Linux中进程本身是可以执行的。在windows中,进程只表示是资源的拥有者,不能单独执行,执行必须要一个线程。

    fork()的含义是把进程本身clone一个新的出来。也就是说,fork之后子进程和父进程都执行同样的一段代码。想要区分,必须通过fork的返回值来区分。

         int pid = fork();

         if (pid < 0) {// printf("error");//小于0,发生错误

         else if( pid == 0 ) {// printf("子进程!");//==0,为子进程

             else{ // printf("父进程! ");}           // >0,父进程

         为什么这个样子呢?Linux主要应用于服务器。而服务器最多用到的是把同一个资源开辟很多个进程给n多个用户来同时使用啊。这样开销够小,响应够快。所以fork快速复制父进程,子进程直接使用父进程的地址。那么子进程需要执行其他的资源呢?用exevc族,这个时候才为子进程开辟自己的地址空间,传入需要执行的文件,就可以执行具体的内容了。

         而windows中,createProcess有一大堆的参数,不过很多时候都默认为null。它的作用相当于fork+execv吧。

         那么怎么理解linuxwindows下的进程管理呢?

         一个进程最基本的内容:PCB、程序段、数据段

         一个线程包含的内容:线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

         线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。  

           

    资源在外存上时候,往往都是代码、资源什么的,就是程序本身。而在内存上的时候,就有了进程,进程相当于代码的一次生命周期,准备了一些最基本的能为运行做准备的上下文情况。而进程总要在cpu上跑一次把,执行一条一条的指令,这个时候就是线程在管理,线程相当于进程的一次生命周期,它真正的活了一把啊。

    那么os在执行时,就是进程线程都要准备好的。而linux在实现的时候,其实相当于是新建了很多指针指向同一块资源,能够直接给你执行,在运行时大家都控制处理它,够快吧。而在需要执行不同的文件内容时,才为他在内存中分配相应的内存空间,做个替换工作,就有新的实体了。而windows下进程是资源的拥有者,你们谁想用就新建个线程自己去跑吧。

    文件格式:PE vs ELF

        windows可执行文件格式是PEportable and executable,可携带可执行)。而linux使用的ELFexecutable and linkable format,可执行和可链接格式)。两者都有相似的东西,比如都分成了几个section,包括代码段,数据段等。但是两个又不一样。

    由于windows内核固定,而linux内核之间往往不兼容。linux软件安装问题往往让人很抓狂。在windows中只需要nextnext一步步继续就好了,而linux的软件包则有很多,.deb.rpm.tar.gz什么的。而内核版本不固定带来的效果是可以升级很快,但向后兼容问题则让我们抓狂的要死。安装过程往往需要更改软件依赖关系什么的!!!Oh, fucking linux。而这些内核理念上的不同很大程度上导致了他们文件格式的不同。

    文件系统:ntfs vs ext2&ext3

        

       NTFS 提供长文件名、数据保护和恢复,并通过目录文件许可实现安全性。NTFS 支持大硬盘和在多个硬盘上存储文件(称为卷)。例如,一个大公司的数据库可能大得必须跨越不同的硬盘。NTFS 提供内置安全性特征,它控制文件的隶属关系和访问。从DOS或其他操作系统上不能直接访问 NTFS 分区上的文件。如果要在DOS下读写NTFS分区文件的话可以借助第三方软件;现如今,Linux系统上已可以使用 NTFS-3G进行对 NTFS 分区的完美读写,不必担心数据丢失。 

    Ext2是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。 

    Ext3是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。 

    1、高可用性 

    2、数据的完整性 

    3、文件系统的速度  尽管使用ext3文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3ext2的性能还要好一些。这是因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统并来说,性能并没有降低。 

    4、数据转换  由ext2文件系统转换成ext3文件系统非常容易 

    5、多种日志模式 

    比较:从技术而言,windows在做这些方面真的很不入流。它对文件系统的以及设备的管理远远不及linuxwindows下的刷新键不知道毒害了多少人呢?

    Linux可以同时管理几千个处理器,windows呢?两个都够呛。Linux连续使用很多天,使用越来越快,windows一会就不行了。Linux的文件使用越多碎片就越少,windows一会就卡的要死。

    中断与I/O:

    1. 中断是由异步的外部事件引起的。外部事件与中断响应及中断响应与正执行的指令没有关系

    2. 异常是执行指令器件检测到不正常的或非法的条件引起的。异常与正执行的指令有直接的联系。根据引起一场的程序是否可被回复和恢复点不同,把异常分为故障(fault)、陷阱(trap)和中止(abort)。

    故障是在引起异常的指令之前,把异常情况通知给系统的一种异常。

    陷阱是在引起异常的指令之后,把异常情况通知给系统的一种异常。

    中止就是中止处理了

    WindowsIRQLInterrupt ReQuest Level)的概念,而linux中没有。

    一个常规的IRQL如下:

    31:高
    30:掉点
    29:处理器间中断
    28:时钟
    27:配置文件
    26



    3:设备中断(其实只用了16)
    2DPC/调度
    1APC
    0:无源 

    Windows中有32级,而linux中似乎只有5级。更多的优先级可以使响应各级服务时更加的好,但是嵌套深度太多总是容易带来一些不必要的麻烦。

    相似之处:

    都将中断分为了两部分。在LINUX中叫ISR(还是其他?)和BOTTOM HALF。而WINODWS中,DPC(Deferred Procedure Calls)和APC(Asynchronous Procedure Calls)就非常类似BOTTOM HALF。 

     以linux为例:

    上半部响应中断,下半部分为中断处理函数。

    下半部分处理机制有tasklet、工作队列、软中断

     软中断
            软中断是静态分配的,这也就意味这如果想定义新的软中断就必须重新编译内核。软中断可以并发的运行在多处理器上,即使同一个软中断也是这样。所以,软中断函数必须是可重入函数,而且需要使用自选锁来保护数据结构。 

    二. tasklet
           tasklet也是一种软中断,但是tasklet比软中断有着更好的并发特性。是io驱动程序首选的可延迟函数方法。tasklet有如下的特性:
    1tasklet可以在内核运行的时候定义
    2)相同类型的tasklet不能在用一个CPU上并发运行,也不能在不同的CPU上并发运
    3)不同类型的tasklet不能在同一个CPU上并发运行,但是可以在不同的CPU上并发运行。所以如果不同的tasklet访问相同的数据结构,需要加一定的锁保护

    三. 工作队列
        工作队列由内核线程来执行。主要的数据结构是workqueue_struct结构。这个结构是是一个cpu_workqueue_struct的数组。cpu_workqueue_struct结构是工作哦队列的基本结构。主要有此工作队列工作的链表,还有内核线程的进程描述符的指针。 工作队列的工作是由work_struct结构组成,这个结构有需要执行的函数,以及传输的数据等字段。建立工作队列是一项非常耗时的操作,因为它会建立一个内核线程。所以linux默认建立了一个工作队列来供使用。每一个CPU一个这样的工作队列。  

    管理:

       注册表 

         这个是windows特色,而linux中每个软件有自己的配置文件即可,灵活性很大

       软件使用 

         其实windows下的软件绝大多数都有linux的对应东西。比如说word,在linux下使用latex做出来效果往往非常只好,而且不会因为移植问题二格式发生变化。用vimide相比呢?其实什么软件最好,当然是diy的了,定制的总是最好的咯

       如何深入内核: shell?(常用命令)

          Linux很多时候通过shell来访问内核,命令行模式为在经常接触内核的过程中算是个很好的选择了。总比windows下用资源浏览器或者ie总出现未响应要好得多吧。

       内核树与补丁?

        其实就是内核源码 

        Linux内核开发流程当前包括一些主内核分支,和很多不同的子系统专有的内核分支。它们是:
    - 主 2.6.x 内核树
    - 2.6.x.y -stable 内核树
    - 2.6.x -git 内核补丁
    - 2.6.x -mm 内核补丁
    - 子系统专有内核树和补丁 

    常用命令  

    cat 文件名 输出文件内容到基本输出(屏幕 or >fileName 到另一个文件)  

    cb 格式化源代码  

    chmod //chang mode,改变文件的权限  

    cp copy

    date 当前的时间和日期  

    echo $abc 在变量赋值之后,只需在变量前面加一个$去引用.

    lint 语法检查程序  

    ls dir

    man help

    more type

    du 查看磁盘空间状况  

    ps 查看当前进程状况  

    who 你的用户名和终端类型  

    定义变量 name=abc? (bash/pdksh) || set name = abc (tcsh)

    mkdir 创建目录  

    rmdir 删除目录  

    cd 进入目录  

    rm 删除文件  

    more 显示文件  

    echo 显示指定文本  

    mv 改文件名  

    pwd 显示目录路径命令 

    uname -r 查看自己的linux内核的版本 

    理念:

         补丁? 真想不通windows为什么那么麻烦,有缺陷通过打补丁的方式,还不断的更新。有病毒买杀毒软件花钱,整理系统花钱,什么都花钱,费劲。

         内核为何使用了C,而非C++

         根据linus torvalds的解释:C++语言想解决的问题都不对路,都是一些皮毛问题,而没有涉及真正深层次的问题。 C++的对象、模板和函数重载都基本上纯粹是C的语法扩展,是语法糖,总体上把C的语法和类型系统都弄得更糟。他建议,在系统编程里直接用C就可以,非系统编程里,应该选择一种有垃圾收集的语言,C++语言的特性基本无用,只会捣乱。因此,什么时候C++都不可能是正确的选择。 

         Linus也承认,在其他一些情况下,可能需要更多语言支持,语言级的内存分配机制如垃圾收集、并发、动态代码生成等等。但是内核开发不需要。 

         很多时候c++stlboost库都已经很成熟了,但是都有一定的编程模型什么的在里面。但是在对内核进行更改的时候,这些东西很可能让内核更改陷入困境。简洁就是美吧,抽象程度太高在某些时候未必奏效吧!!!

    面试中常见OS问题:

       进程与线程区别?线程安全?

       进程状态切换?

       死锁?死锁条件?

       创建进程、子进程?

       常见linux命令?

       中断?Windowslinux下的区别?

       IPC?那两大类?主要的ipc方式?

       Linux建立工程编译等问题?

       Linux编译内核?内核移植?

       Socket编程?

       Gdb调试程序?Makefile熟悉?

       驱动开发熟悉否?编写驱动?

       。。。

    总评:

       Windows在很多设计上远不及linux的。Windows好比一坨屎,大家都在吃屎;linux好比一个美女,大家想上而不得。没那么高的能力把,所以大家yylinux还是回去接着吃屎吧!!!!

    展开全文
  • 计算两个日期之间的天数 cur_date=`date +%s` ago_date=`date +%s -d '1 month ago'` a=$((($cur_date - $ago_date)/86400)) 注意:在赋值给a时可以需要多写个括号,即将(($cur_date - $ago_date)/86400)作为一个...
  • Linux与Windows命令对比

    2018-12-23 09:38:15
    Linux与Windows命令的比较 文件目录操作 Command Linux Windows 批处理 .sh .bat 帮助 cmd –help / -h 列出目录文件 ls/ ls -l dir 改变当前目录 cd cd 进父目录 cd .. cd .....
  • windows与linux常用命令对比 windows与linux常用命令对比 序号 Windows命令 Linux命令 命令描述 1 assign ln 链接文件或目录 2 attrib chmod 更改文件权限 3 .bat...
  • Linux和DOS命令对比

    2013-10-02 17:34:55
    命令说明 DOS命令 Linux命令 复制文件 copy cp 转移文件 move mv 列举文件 dir ls 清除屏幕 cls clear
  • DOS 和 Linux 常用命令的对比许多在 shell 提示下键入的 Linux 命令都与你在 DOS 下键入的命令相似。事实上,某些命令完全相同。 本附录提供了 Windows 的 DOS 提示下的常用命令以及在 Linux 中与它们等同的命令。...
  • 在Shell中我们可以利用date命令比较两个日期的大小,方法是先把日期转换成时间戳格式,再进行比较。 date 的+%s可以将日期转换成时间戳格式,看下面的例子: #!/bin/bash   date1="2008-4-09 12:00:00" ...
  • 每一种Linux嵌入式系统文件系统都有其不同的作用和特点,特别是系统文件,它承载着系统是否可以安全运行,如果出现错误,那么将导致系统退出,严重影响我们的使用。嵌入式系统文件系统比较jffs2, yaffs, cramfs, ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 参照学习表 DOS和Linux常用命令的对比  许多在 shell 提示下键入的 Linux 命令都与你在 DOS 下键入的命令相似。事实上,某些命令完全相同。  本附录提供了 Windows 的 DOS 提示下的常用命令以及在 Linux 中与...
  • Linux Windows 查看系统信息 查看系统版本 cat /etc/issue cat /proc/version ver 查看系统信息 N/A systeminfo MISC 清除屏幕 clear cls 查看系统日期 date date 查看系统时间 date time 改日期 ...
  • Linux查看时间

    2019-03-07 11:47:54
    一、查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" 方法 B 仅限于RedHat Linux 和 CentOS 命令 : "timeconfig" ...
  • Linux Windows 批处理 .sh .bat 帮助 cmd –help / -h 列出目录文件 ls/ ls -l dir 改变当前目录 cd cd 进父目录 cd .. cd .. 进home目录 cd ~ 复制 cp co...
1 2 3 4 5 ... 20
收藏数 14,690
精华内容 5,876
热门标签
关键字:

linux 日期对比