• UnixOnWindows Windows上面的Unix命令练习工具,让你不用装Unix也能练习Unix命令。用法:1.把文件解压的本地,2.运行-cmd 打开DOS命令窗口,3.用CD命令进入到刚才解压下来的UnixOnWindows目录,4.现在你就可以练习啦...
  • Unix 常用命令练习软件 By Unix e_Lab Activities(Cisco Press) Cisco Networking Academy Program Fundamental of UNIX Unix e_Lab Activities Cisco Press 软件语言:英文 系统环境:Windows + Micromedia ...
  • 为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是Dos\Windows下的CRLF。”  换行,在普通文档编辑中,就是按下“Enter”键。在编写代码时,就是在文件中写入...

      平时测试工作中,少不了制造测试数据。最近一个项目,我就需要制造一批可在UNIX下正确读取的文件。为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是Dos\Windows下的CRLF。”

      换行,在普通文档编辑中,就是按下Enter”键。在编写代码时,就是在文件中写入字符串”\n”。但用python命令w在文件写入换行”\n”以后,由于是Windows系统的原故,会默认把”\n”实际保存为”\r\n”

      对于Windows下为何是”\r\n”,这里引用网上的解释:因为Windows采用了传统的英文打字机模式,它在换行时需分解成两步——回车”\r”和换行”\n”。回车(carriage return,CR)是将小车退回至起点,相当于把光标从行尾切换到行首,换行(line feed,LF)是将小车切换到下一行,这样的组合操作就完成了另起一行的目的。

      我们首先确认Windows下的换行是否真的是CRLF:把文件用任意一款文本编辑器(以Notepad++为例)打开,在编辑器的菜单栏中,找到“视图”菜单,点击“显示符号”,勾选“显示所有字符”,就可以显示换行符了。我们在下图中可以看到,在Windows系统下,文件中的换行符确实是CRLF

       

      如何把CRLF变成LF呢?开发给出了一个解决方案。

      Method A

      在Notepad++界面右下角,双击当前文件格式的描述:Dos\Windows”,点击弹框中的“转换为UNIX格式”,最后保存文件。此时可以看到文件每行结尾都已经展示为“LF”了。

       

      虽然整个转换过程极为简单,但要是有一大批这样的文件需要一个个手动转换,我不禁感慨光(xīn)阴(hǎo)虚(lèi)度,韶()光(xiǎng)易(dòng)逝。

      在表达抗议后,开发表示可以优化此方法,即使用文本编辑器的替换功能:

      Method B:

      使用Notepad++打开原文件,按下组合键Ctrl+F后,在弹框中选择“替换”栏,在“查找目标”输入框填写“\r\n”,“替换为”输入框填写“\n”,“查找模式”选择“扩展(\n\r\t\0\x...)”,点击“替换所有打开文件”后,一一保存文件即可。

      然而把所有的文件保存一遍,并不能提升测试的幸福感。我追求的是尽量减少重复而繁重的手工劳动,解放双手,高效测试!类似这样的能力瓶颈,从我进入测试行业开始,就不断挤占着我的业余时间。为了更好的提高自己,系统地学习测试开发所必需的技能,我报名参加了吴老的测试开发培训班。

      截至目前,吴老已经授课两个多月,我从无到有,学习了很多基本的python开发知识,也偶尔能接触到一些巧妙的编程思维。正好这次的数据准备,给我提供了一个实践的契机,让我运用最近学习的文件操作知识,体验了一次局部自动化的乐趣。

      下面给大家分享一下我这次愉快的实践内容,由于真实的测试数据略有复杂,这里就用简单的两行数字来举个栗子。

      首先按上课所讲的内容,依葫芦画瓢,使用Notepad++创建文件并写入文本内容:

     1 #coding:utf-8(设定文件编码格式)
     2 import os
     3 import time
     4 
     5 #切换到创建文件目录
     6 os.chdir(r"C:\Study\Chestnuts\01data")
     7 
     8 #新建创建文件函数
     9 def create_file():
    10 
    11     #构造文件名:以“年月日”为文件名的.dat文件
    12     t=time.localtime()
    13     file_name=time.strftime("%Y-%m-%d",t)+".dat"
    14     #创建并打开文件
    15     fp=open(file_name,'w+')
    16     #写入文件内容
    17     fp.writelines("12345\n")
    18     fp.writelines("67890\n")
    19     #关闭文件
    20     fp.close()
    21     
    22 #调用函数
    23 create_file()

      如上图所示,执行脚本就会生成一份原始文件,不过在两行内容的末尾,换行符均显示为CRLF,接下来就是转换的工作了。

      Method C:对原文件进行格式转换

      如果是对现有的文件进行处理,可以使用Notepad++再编写一个转换的脚本。参考网上的方法,使用rU方式读取文件内容,使用wb方式写入文件内容,如下图所示: 

     1 #coding:utf-8
     2 import os
     3 
     4 #文件路径准备    
     5 route=r"C:\Study\Chestnuts\01data"
     6 
     7 #遍历路径下目录,文件夹,文件
     8 for root,dirs,files in os.walk(route):
     9     #遍历文件
    10     for name in files:
    11         #归纳文件名特征
    12         if name[-3:]=='dat':
    13             #拼接文件名(目录+文件名称)
    14             catalog=os.path.join(root,name)
    15             #把所有行分割符替换为换行符\n返回. 
    16             fp=open(catalog,"rU+")
    17             #读取文件并保存
    18             strings=fp.read()
    19             fp.close()
    20             #使用二进制写文件
    21             fp1=open(catalog,"wb")
    22             fp1.seek(0)
    23             fp1.write(strings)
    24             fp1.flush()
    25             fp1.close()

      执行这个脚本,就能对现有文件格式进行转换,得到换行符是LF的文件了。

      结果是对了,但执行两个脚本来生成一份最终文件,难免让我觉得还不够简单。我分析了以上文件转换的代码,发现关键步骤是使用二进制(wb)方式写入文件。

      Method D:原文件使用二进制方式写入

      既然这样,不如在一开始就使用二进制写文件,一步到位!并且只需把源代码中写入方式(w)变成二进制写入(wb)方式即可。你看,仅仅添加了一个字母,就省去了十几行代码,还达到了预期目标,可谓一举多得!

    #coding:utf-8(设定文件编码格式)
    import os
    import time
    
    #切换到创建文件目录
    os.chdir(r"C:\Study\Chestnuts\01data")
    
    #新建创建文件函数
    def create_file():
    
        #构造文件名:以“年月日”为文件名的.dat文件
        t=time.localtime()
        file_name=time.strftime("%Y-%m-%d",t)+".dat"
        #创建并打开文件
        fp=open(file_name,'wb+')
        #写入文件内容
        fp.writelines("12345\n")
        fp.writelines("67890\n")
        #关闭文件
        fp.close()
        
    #调用函数
    create_file()

      窥一斑而见全豹,以上的代码优化,提醒我编程时需要多思考,理清逻辑,最终找到达成目标的最佳方案。在练习编写代码时,不仅要认真分析需求,分解步骤,也要注意积累好的方法进行沉淀,这也是我写下本文的目的所在。

      如果大家在测试工作中,也遇到了类似的困难,觉得自己能力欠缺,期望通过自己编写代码解决问题,欢迎大家咨询我或者吴老。可以加入我们的“光荣之路python群(457561756)”进行提问,也可以来吴老的测试开发培训班一起学习。为了更全面的提升,为了更丰厚的待遇,也为了更美好的生活,让我们在光荣之路一起奋斗!

    作者:Flyleaves
    出处:http://www.cnblogs.com/Flyleaves/
    本文版权归作者、微信公众号光荣之路和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    转载于:https://www.cnblogs.com/Flyleaves/p/5718040.html

    展开全文
  • 实验一 UNIX/LINUX及其使用环境 (一)UNIX常用命令简介 ...1、通过WINDOWS操作系统中的远程登录程序telnet.exe 登录UNIX。 2、熟悉UNIX/LINUX的常用基本命令如ls、who、w、pwd、ps、pstree、top等。 3、通...
        

    实验一 UNIX/LINUX及其使用环境

    (一)UNIX常用命令简介


    实验目的

    1、了解UNIX的命令及使用格式

    2、熟悉UNIX/LINUX的常用基本命令。


    实验内容

    1、通过WINDOWS操作系统中的远程登录程序telnet.exe 登录UNIX

    2、熟悉UNIX/LINUX的常用基本命令如lswhowpwdpspstreetop等。

    3、通过WINDOWS操作系统中的FTP程序,练习WINDOWSUNIX之间的文件交换。


    实验准备

    预习附录一《UNIX/LINUX简介》


    实验指导

    一、UNIX的登录与退出

    1、登录

    DOS环境下用MS提供的telnet程序(也可使用WINDOWS 自带的telnet图形界面程序或多功能的S-Term终端程序),可使PC作为终端(terminal)登录(loginUNIX服务器(UNIX Server)。


    1)执行格式:

    telnet hostname(主机名)

    telnet 主机的IP地址

    例: telnet www.yahoo.com

    telnet 140.122.77.120

    2)步骤

    login: (输入username

    password: (输入密码)

    2、退出

    UNIX系统提示符$下,输入logoutexitshutdown

    例:$ logout

    二、UNIX命令格式

    命令 [选项] [处理对象]

    例:ls -la mydir

    注意:(1)命令一般是小写字串。注意大小写有别

    2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作

    3)同一行可有数个命令,命令间应以分号隔开

    4)命令后加上&可使该命令后台(background)执行

     

    三、常用命令

    1、目录操作

    DOS相似,UNIX采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以/ 隔开。用户login后,工作目录的位置称为 home directory,由系统管理员设定。~’符号代表自己的home directory,例如 ~/myfile 是指自己home目录下myfile这个文件。

    UNIX的通配符有三种:*’?’ 用法与DOS相同,-‘ 代表区间内的任一字符,如test[0-5]即代表test0test1,……,test5的集合。

    1)显示目录文件 ls

    执行格式: ls [-atFlgR] [name] (name可为文件或目录名称)

    例: ls 显示出当前目录下的文件

    ls -a 显示出包含隐藏文件的所有文件

    ls -t 按照文件最后修改时间显示文件

    ls -F 显示出当前目录下的文件及其类型

    ls -l 显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称

    ls -lg 同上

    ls -R 显示出该目录及其子目录下的文件

    :ls与其它命令搭配使用可以生出很多技巧(最简单的如"ls -l | more")更多用法请输入ls --help查看其它命令的更多用法请输入 命令名 --help 查看.


     

    2)建新目录 mkdir

    执行格式: mkdir directory-name

    例: mkdir dir1   (新建一名为dir1的目录)

    3)删除目录  rmdir

    执行格式: rmdir directory-namerm directory-name

    例:rmdir dir1 删除目录dir1,但它必须是空目录,否则无法删除

    rm -r dir1 删除目录dir1及其下所有文件及子目录

    rm -rf dir1 不管是否空目录,统统删除,而且不给出提示,使用时要小心


    4)改变工作目录位置 cd

    执行格式: cd [name]

    例: cd 改变目录位置至用户login时的working directory

    cd dir1 改变目录位置,至dir1目录

    cd ~user 改变目录位置,至用户的working directory

    cd .. 改变目录位置,至当前目录的上层目录

    cd ../user 改变目录位置,至上一级目录下的user目录

    cd /dir-name1/dir-name2 改变目录位置,至绝对路径(Full path

    cd - 回到进入当前目录前的上一个目录


    5)显示当前所在目录pwd

    执行格式: pwd

    6)查看目录大小du

    执行格式: du [-s] directory

    例: du dir1 显示目录dir1及其子目录容量(以kb为单位)

    du -s dir1 显示目录dir1的总容量

    7)显示环境变量

    echo $HOME 显示家目录

    echo $PATH 显示可执行文件搜索路径

    env 显示所有环境变量(可能很多,最好用"env | more","env | grep PATH")

    8)修改环境变量,在bash下用export,如:

    export PATH=$PATH:/usr/local/bin

    想知道export的具体用法,可以用shellhelp命令:help export

    2、文件操作

    1)查看文件(可以是二进制的)内容 cat

    执行格式:cat filenamemore filenamecat filename|more

    例: cat file1 以连续显示方式,查看文件file1的内容

    more file1

    cat file1|more 以分页方式查看文件的内容

    2)删除文件 rm

    执行格式: rm filename

    例: rm file?

    rm f*

    3)复制文件 cp

    执行格式: cp [-r] source destination

    例: cp file1 file2file1复制成file2

    cp file1 dir1file1复制到目录dir1

    cp /tmp/file1file1复制到当前目录

    cp /tmp/file1 file2file1 复制到当前目录名为file2

    cp –r dir1 dir2 (recursive copy)复制整个目录。

    4)移动或更改文件、目录名称mv

    执行格式: mv source destination

    例: mv file1 file2 将文件file1,更名为file2

    mv file1 dir1 将文件file1,移到目录dir1

    mv dir1 dir2

    5)比较文件(可以是二进制的)或目录的内容 diff

    执行格式:diff [-r] name1 name2 (name1name2同为文件或目录)

    例: diff file1 file2 比较file1file2的不同处

    diff -r dir1 dir2 比较dir1dir2的不同处

    6)文件中字符串的查找 grep

    执行格式: grep string file

    例: grep abc file1 查找并列出串abc所在的整行文字

    7)文件或命令的路径寻找

    执行格式一:whereis command 显示命令的路径

    执行格式二:which command 显示路径及使用者所定义的别名

    执行格式三:whatis command 显示命令的功能摘要

    执行格式四:find search -path -name filename -print

    搜寻指定路径下某文件的路径

    执行格式五:locate filename

    根据系统预先生成的文件/目录数据库(/var/lib/slocate/slocate.db)查找匹配的文件/目录,查找速度很快,如果有刚进行的文件改变而系统未到执行定时更新数据库的时间,可以打入updatedb命令手动更新.

    8)建立文件或目录的链接 ln

    : ln source target1 建立source文件(已存在)的硬链接,命名为target1

    ln -s source target2 建立source文件的符号链接,命名为target2


    3、系统询问与权限口令

    1)查看系统中的使用者

    执行格式: who

    2)查看username

    执行格式: who am I 查看自己的username

    3)改变自己的username的帐号与口令 su

    执行格式: su username

    例: su username 输入帐号

    password 输入密码

    4)文件属性的设置 chmod

    改变文件或目录的读、写、执行的允许权

    执行格式: chmod [-R] mode name

    其中[-R]为递归处理,将指定目录下所有文件及子目录一并处理

    mode3-8位数字,是文件/目录读、写、执行允许权的缩写(r:read,数字代号为"4" w:write,数字代号为"2" x:execute,数字代号为"1")


    moderwx rwx rwx

    user group other

    缩写: (u) (g) (o)

    例:chmod 755 dir1 将目录dir1设定成任何人皆有读取及执行的权利,但只有拥有者可作写修改。其中7=4+2+1,5=4+1


    chmod 700 file1file1设为拥有者可以读、写和执行

    chmod o+x file2file2,增加拥有者可执行的权利

    chmod g+x file3file3,增加组使用者可执行的权利

    chmod o-r file4file4,除去其它使用者可读取的权利

    5)改变文件或目录所有权 chown

    执行格式: chown [-R] username name

    例: chown user file1 将文件file1改为user所有

    chown .fox file1 将文件file1改为fox组所有

    chown user.fox file1 将文件file1改为fox组的user所有

    chown -R user dir1 将目录dir1及其下所有文件和子目录,改为user 所有

    6)检查用户所在组名称 groups

    执行格式: groups

    7)改变文件或目录的组拥有权 chgrp

    执行格式: chgrp [-R] groupname name

    例: chgrp vlsi file1 将文件file1改为vlsi组所有

    chgrp -R image dir1 将目录dir1及其下所有文件和子目录,改为image群组

    8)改变文件或目录的最后修改时间 touch

    执行格式: touch name

    4、进程操作

    1)查看系统目前的进程 ps

    执行格式: ps [-aux]

    例:psps -x 查看系统中属于自己的process

    ps -au 查看系统中所有使用者的process

    ps -aux 查看系统中包含系统内部及所有使用者的process

    ps -aux|grep apache 找出系统中运行的所有名称中带有"apache"串的process


    2)查看正在background中执行的process

    执行格式: jobs

    3)结束或终止进程 kill

    执行格式: kill [-9] PIDPID为利用ps命令所查出的process ID

    例: kill 456

    kill -9 456 终止process ID456process

    4)后台(background)执行process command的命令

    执行格式: command & (在命令后加上&

    例: gcc file1 & 在后台编译file1.c

    注意:按下^Z,暂停正在执行的process。键入bg”,将所暂停的process置入background中继续执行。

    例: gcc file1 &

    ^Z

    stopped

    bg

    5)结束或终止在background中的进程 kill

    执行格式: kill %n

    例:kill %1 终止在background中的第一个job

    kill %2 终止在background中的第二个job

    6)显示系统中程序的执行状态

    : top -q 不断地更新、显示系统程序的执行状态

    第一行显示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。

    第二行为进程情况,依次为进程总数、休眠进程数、运行进程数、僵死进程数、终止进程数。

    第三行为CPU状态,依次为用户占用、系统占用、优先进程占用、闲置进程占用。

    第四行为内存状态,依次为平均可用内存、已用内存、空闲内存、共享内存、缓存使用内存。

    第五行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、高速缓存容量。


    PID 每个进程的ID

    PPID 每个进程的父进程ID

    UID 每个进程所有者的UID

    USER 每个进程所有者的用户名。

    PRI 每个进程的优先级别。

    NI 该进程的优先级值。

    SIZE 该进程的代码大小加上数据大小再加上堆栈空间大小的总数。单位是KB

    TSIZE 该进程的代码大小。对于内核进程这是一个很奇怪的值。

    DSIZE 数据和堆栈的大小。

    TRS 文本驻留大小。

    D 被标记为“不干净”的页项目。

    LIB 使用的库页的大小。对于ELF进程没有作用。

    RSS 该进程占用的物理内存的总数量,单位是KB

    SHARE 该进程使用共享内存的数量。

    STAT 该进程的状态。其中S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态。

    TIME 该进程自启动以来所占用的总CPU时间。如果进入的是累计模式,那么该时间还包括这个进程子进程所占用的时间。且标题会变成CTIME

    %CPU 该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。

    %MEM 该进程占用的物理内存占总内存的百分比。

    COMMAND 该进程的命令名称,如果一行显示不下,则会进行截取。内存中的进程会有一个完整的命令行


    "ctrl+c"停止查看


    7)以树状图显示执行的程序 pstree

    : pstree -h 列出进程树并高亮标出当前执行的程序

    8)监视虚拟内存 vmstat

    vmstat对系统的虚拟内存、进程、CPU活动进行监视,同时它也对磁盘和forksvforks操作的个数进行汇总。

    不足是:vmstat不能对某个进程进行深入分析,它仅是一对系统的整体情况进行分析。

    例如:[angel@home /angel]# vmstat

    procs memory swap io system cpu

    r b w swpd free buff cache si so bi bo in cs us sy id

    0 0 0 7180 1852 56092 48400 0 0 6 5 24 8 0 0 18

    其中:

    Procs

    r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数。

    Memory

    swpd: 虚拟内存使用情况,单位:KB free: 空闲的内存,单位KB

    buff: 被用来做为缓存的内存数,单位:KB

    Swap

    si: 从磁盘交换到内存的交换页数量,单位:KB/ so: 从内存交换到磁盘的交换页数量,单位:KB/

    IO

    bi: 发送到块设备的块数,单位:块/ bo: 从块设备接收到的块数,单位:块/

    System

    in: 每秒的中断数,包括时钟中断 cs: 每秒的环境(上下文)切换次数

    CPU CPU 的总使用百分比来显示

    us: CPU 使用时间 sy: CPU 系统使用时间 id: 闲置时间

    9)分析共享内存、信号量和消息队列 ipcs(相关命令ipcrm:用于给有权限的用户清除这些量,注意不要乱清除,除非该量确实失效了)

    例如:[angel@home /angel]# ipcs

    ------ Shared Memory Segments --------

    key shmid owner perms bytes nattch status

    0x00280267 0 root 644 1048576 1

    0x61715f01 1 root 666 32000 33

    0x00000000 2 nobody 600 92164 11 dest


    ------ Semaphore Arrays --------

    key semid owner perms nsems status

    0x00280269 0 root 666 14

    0x61715f02 257 root 777 1


    ------ Message Queues --------

    key msqid owner perms used-bytes messages


    10)监视用户空间程序发出的全部系统调用 strace

    strace 还能显示调用的参数,以及用符号方式表示的返回值。

    strace 从内核中接收信息,所以一个程序无论是否按调试方式编译(gcc -g)或是否被去掉了调试信息,都可以被跟踪。

    执行格式: strace [-tTeo] executable-program-name

    -t : 用来显示调用发生的时间

    -T : 显示调用花费的时间

    -e : 限定被跟踪的调用类型

    -o : 将输出重定向到一个文件中

    类似命令:ltrace [-fiS] executable-program-name


    5、通信类

    1)本地工作站与UNIX服务器间的文件传输 ftp

    执行格式: ftp 主机名

    ftp 主机的IP地址

    后续执行步骤:


    name

    输入帐号

    password

    输入密码

    ftp>help

    显示ftp可使用的所有命令

    ftp>lcd dir1

    改变本地机当前目录为dir1

    ftp>get file1

    UNIX服务器文件file1拷到本地机

    ftp>put file2

    将本地文件file2,拷到UNIX服务器

    ftp>!ls

    显示本地机当前目录下所有文件

    ftp>!pwd

    显示本地机当前所在目录下所有文件

    ftp>ls

    显示UNIX服务器当前目录下所有文件

    ftp>dir

    显示服务器当前目录下所有文件(略同于UNIXls -l指令)

    ftp>pwd

    显示UNIX服务器当前所有目录位置

    ftp>cd dir1

    更改UNIX服务器的目录至dir1

    ftp>mget *.c

    将服务器中 .c 文件拷到本地机中

    ftp>mput *.txt

    将所有 .txt 文件拷贝到服务器

    ftp>quit

    结束ftp工作

    ftp>bye

    结束ftp工作


    2)检查与UNIX服务器连接是否正常 ping

    执行格式: ping hostname

    ping IP-Address

    例: ping 127.1.1.1

    3)将文件当做E-mail的内容送出 mail

    执行格式:mail -s “Subjict-string” username@address

    例: mail -s “program” user

    功能:将file.c当做mail的内容,送至usersubject nameprogram

    4)传送E-mail给本地UNIX服务器上的用户 mail

    执行格式: mail username

    5)读取信件 mail

    执行格式: mail

    6)列出套接字使用情况 socklist

    7)查看网络连接 netstat


    6I/O命令

    1)管道(pipe-line)的使用

    执行格式:command1|command2

    功能:将command1的执行结果送到command2 作为输入

    例:ls -R1|more 以分页方式列出当前目录文件及子目录名称

    cat file1|more 以分页方式,列出file1的内容

    2)标准输入控制

    执行格式: command-linefile作为command-line的输入

    例: mail -s “mail test” user@iis.sinica.edu.tw

    功能:将文件file1当作信件的内容,subject 名称为mail test 送给收信人

    3)标准输出控制

    执行格式一: command>filename

    功能:将command的执行结果送至指定的filename

    例: ls -l >list 将执行ls -l” 的结果写入文件list

    执行格式command>!filename

    功能:同上,若filename文件已存在,则强迫重写

    执行格式三: command>&filename

    功能:将command执行所产生的任何信息写入filename

    执行格式四:command>>filename

    功能:将command 的执行结果,附加(append)到filename

    执行格式五:command>>&filename

    ????????????功能:将command执行所产生的任何信息附加于filename

    7、其它常用命令

    1)命令在线帮助 man

    执行格式:man command

    例: man ls 查询ls这个指令的用法

    2)设定命令记录表长度 history

    执行格式一:set history=n

    例: set history=40

    功能:设定命令记录表长度为40(可记载执行过的前面40个命令)

    执行格式二: history 查看命令记录表的内容

    3)显示说明 info

    执行格式: info command-name

    : info gcc

    功能: 查看gcc的说明,按上下箭头选定菜单,回车进入,"u"键返回上级菜单.

    info不加参数则进入最上一级菜单.


    四、用cat 命令查看 /proc 动态文件系统目录下的文件,辨识其中的系统信息.

    例如: cat interrupts 列出当前中断占用情况

    cat ioports 列出设备的硬件IO占用情况

    cat pci 列出pci设备的情况

    展开全文
  • 这是作者的呕心沥血之作...第一步,能够在windows命令行运行bash 第二步,下载好unuix网络编程所需要的文件也就是书上unpv13e.tar,我的ftp服务器上有。 第三步,(这个真的是我研究了巨久的,unix上试了无数遍最终在w

    这是作者的呕心沥血之作!!!!!!!!!!!!!!!!!!!!

    首先unix网络编程可在win10下写,win10推出了ubuntu for win10,真的是一个很棒的东西

    第一步,能够在windows命令行下运行bash

    第二步,下载好unuix网络编程所需要的文件也就是书上unpv13e.tar,我的ftp服务器上有。

    第三步,(这个真的是我研究了巨久的,unix上试了无数遍最终在win10的bash上成功),在win10的bash下进入到你的unpv13e文件夹所在的目录,win下  c盘在 /mnt/c  ,最后以root权限进入,然后在命令行输入看下图


    第四步,进入到lib,然后执行make


    第五步:当执行完make后unpv13e文件夹就出现了一个链接库的文件libunp.a,然后把这个库文件复制到系统可以找到的路径中,我们将它放到/usr/lib


    第六步:讲例子中要用到的头文件unp.h(在/unpv13e/lib文件夹里面),以及unp.h要用到的头文件config.h(在unpv13e文件夹里)复制到/usr/linclude中


    第七步:unp.h包含了config.h,而在/usr/include中他们是在同一个文件夹下的,所以我们对unp.h文件做如下的设置

    1. #include "../config.h"  改成  #include "config.h"

    2.在unp.h中添加一行   #define MAXLINE 2048

    修改代码到此结束

    第八步:Unix网络编程这本书上的所有例子,我们在写包含unp.h的头文件路径时都必须要写成

                  #include "../../include/unp.h"

    到此Unix网络编程的所有环境全部已经搭建完毕,我们跑几个书上的例子试验一下,当我们晚上两点运行成功的时候,心情那是相当的激动。



    祝大家新年快乐,羊年学习Unix网络编程顺利,写代码再无BUG



    展开全文
  • 2018年8月更新: 这个暑假博主和小伙伴、老师一同为师弟师妹们折腾了一个关于计算机学习交流的小社区 0xFFFF ,经过一个暑假的积淀,...最近有许多师弟师妹们问入门 C 语言和 C++ 的时候练习代码应该装什么软件。 ...

    2018年8月更新:
    这个暑假博主和小伙伴、老师一同为师弟师妹们折腾了一个关于计算机学习交流的小社区 0xFFFF ,经过一个暑假的积淀,留下了不少适合计算机入门阅读的内容,推荐给看到这篇文章的你。
    关于计算机新手入门的话题 - 0xFFFF

    --------------- 开始正文 ----------------
    最近有许多师弟师妹们问入门 C 语言和 C++ 的时候练习代码应该装什么软件。

    根据老师和前辈们的建议以及我这一年的折腾经验,在 Linux 系统下学习 C 语言和 C++ 的话那真是极好的,但是鉴于现实的情况(例如 Linux 命令行操作对于一个暂时对电脑不是非常了解的人来说可能一开始不太好上手),很多东西还是需要在 Windows 下进行。

    在 Windows 下编程,大多数人用的是“宇宙最强IDE”—— Visual Studio (ps: IDE 是集成开发环境的简称),VS 的确好用,基本把你需要的东西都准备好了,然而装过的人都知道,装这东西有时候可以折腾你一下午,没设置好的话可能一下子装了几 GB 现在的我们还不知道是拿来干什么的东西。

    师兄推荐了 Code::Blocks 这个相比 VS 更简洁的IDE,但我觉得可以更简单。

    所以我推荐 文本编辑器 + GCC 编译器 这个无敌组合,在入门阶段已经足够了。

    为什么用这个组合而不是直接上IDE

    关注本质

    首先我们得对 C 语言/ C++ 程序的运行流程有一个基本的认识,从 Think-C 的1.1节我们可以知道。C/C++的源代码 (source code) 需要经过编译 (compiling) 这个过程转换为二进制可执行文件才能运行。

    snipaste_20170812_212454.png

    snipaste_20170812_212454.png

    本质上来说,其实所有的 C、C++、Java、Python 等语言的源代码(对应的源文件后缀分别为.c .cpp .java .py等)都属于文本文件,除了后缀名之外没有其它差别,所以它们都可以通过文本编辑器编辑。

    写好代码,通过编译器把代码编译成可执行文件,写的程序就能运行了。

    所以说,入门 C语言/ C++ 编程,实际上我们只需要两个工具:文本编辑器编译器。其它的诸如调试器等工具都是围绕着它们工作的。

    类似 Visual Studio,Code::Blocks 这样的 IDE ,它也可以说是文本编辑器以及编译器和调试器等等工具的结合体,它们是为了高效解决工程问题的产物。

    为了工程上的效率,IDE隐藏了许多细节,通过IDE入门编程,点击编译按钮的背后,IDE为我们做了什么事情,我们并不容易注意到,且初学时我们也用不上太复杂的东西,刚开始就使用过于大而全的工具容易陷入迷茫。例如 Visual Studio 里“解决方案资源管理器”之类的界面,还有装 Visual Studio 的时候装上的各种各样奇奇怪怪的组件(实际上它们都不是重点)。

    我们写代码总不可能依赖于某个编程工具,所以趁现在写的东西还不复杂的时候,多多了解、亲身体验一下那些相对更底层的东西,对我们的发展是很有帮助的。

    以后我们写相对复杂的项目,基本的功能满足不了我们的需要的时候,再选择一个强大的 IDE 来帮助我们更好地组织管理我们的代码,我认为这是一个适合初学者的较为平缓的学习路径。

    通过GCC的使用初步了解命令行

    入门阶段的我们写的程序基本是在命令行(又叫终端)下运行的,即使你直接在Windows的图形界面下运行这些程序,系统还是要弹出一个命令行窗口为它提供一个运行的环境,熟悉命令行的重要性不言而喻。

    GCC全套工具都是在命令行下使用的,还有许多优秀的工具和程序,例如 Python 解释器、Node.js 以及依赖 Node.js 的一系列网页前端开发的构建工具、以后工作或参与开源项目时肯定会用到的 Git,SVN 等版本控制工具等等,也是在命令行下运行的。在使用GCC的过程中我们可以收获很多关于命令行的概念和使用技巧,对命令行有一个初步的印象。

    学习计算机,我们无可避免的要接触到 Linux 操作系统。通过 GCC 编译器的使用,也可以为我们熟悉 Linux 建立一点基础。Linux 内核作为 Unix 内核的开源实现,在命令行方面的功能是非常强大的,围绕着 Linux 内核有许许多多优秀的应用程序,GCC 只是它其中的冰山一角。工具繁多,一开始总会让人感到眼花缭乱,学习曲线也相对陡峭。

    平时我们可能熟悉 Windows 多一些,在 Windows 中,命令行与 Linux 有许多相似之处,从 Windows 熟悉命令行开始也可以作为一个过渡的方式。

    节省磁盘空间

    值得关注的是,相比 VS 动辄上 GB 的空间占用,这个装完最多也就占用几百M硬盘空间,岂不美哉?

    关于 GCC 的介绍

    关于GCC的发展史,推荐阅读:
    鸟哥的Linux私房菜

    引用一段来自维基百科的解释:

    GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),一套编程语言编译器,以GPLLGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。

    原名为GNU C语言编译器GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理FortranPascal)、Objective-CJavaAda,以及Go与其他语言。

    许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。苹果电脑Mac OS X操作系统也采用这个编译器。

    文本编辑器的选择与安装

    说到文本编辑器,我们第一时间想到的应该就是记事本了,但是有一点大家要注意,不推荐使用记事本编辑代码。原因是 Windows 自带的记事本编辑的 Unicode 文本文件头部会自带 BOM,BOM 在某些环境下会出现问题,参考知乎上的这个回答 补充阅读:「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个? - 知乎

    适合写代码用的文本编辑器有很多,这里推荐的有:Vim,Emacs,Atom,VSCode,Notepad++,Sublime Text等。我们可以多多尝试,用心去感受一下它们各自的特点,然后选一个喜欢的作为陪伴我们编程生涯的主力文本编辑器。

    以上提到的文本编辑器,除了 Notepad++ 只支持 Windows 之外,其它的编辑器在 Windows,Linux,macOS 下都有各自的版本。它们都支持安装各种插件实现特定领域的强大功能,限于篇幅这里先不说了。

    在这里我用的是 Atom(点击进入官网

    2018.05.09 更新
    博主现在已经转投 VS Code 编辑器,VS Code 的设计对初学者也更友好一些
    点击链接直达官网下载地址 https://code.visualstudio.com/Download 
    VSCode 安装与使用方法与 Atom 类似
    由于截图的工程量较大,所以这里就不更新截图啦~

    鉴于国外服务器下载速度较慢的原因,建议从淘宝的 npm 源镜像里面下载最新版 Atom 安装文件,截至这篇文章发表之时它更新到了 1.19.0 版

    https://npm.taobao.org/mirrors/atom/

    在网页上我们可以看到有一大堆不同平台的安装文件在上面,我们下载 AtomSetup-x64.exe

    下载好之后和一般的软件一样,打开安装就行,安装好后我们发现桌面多了这个图标。 说明编辑器已经可以用了。

    snipaste_20170812_203007.png

    snipaste_20170812_203007.png

    GCC编译器的安装

    GCC是个跨平台的开源的编译工具套装,自然在 Windows 下也会有相应的集成包,一般用的比较多的有 MinGW、MinGW-w64 和 TDM-GCC ,三者的区别和联系可以参考这篇博文,这里我们用的是TDM-GCC。

    ps: Code::Blocks、Dev-C++ 软件默认也是使用 GCC 编译器编译代码的

    打开TDM-GCC的官网 ,点击中间的 "TDM64 bundle" 下载安装包,运行安装包

    点击 Create,开始一个新的安装

    snipaste_20170812_210217.png

    snipaste_20170812_210217.png

    我们用的基本都是64位的电脑,当然是选择64位啦。

    snipaste_20170812_210354.png

    snipaste_20170812_210354.png

    一路Next就可以了

    Clipboard_20170812.png

    Clipboard_20170812.png

    Clipboard_20170812 (1).png

    Clipboard_20170812 (1).png

    整个安装向导跑完之后,GCC 编译器就已经在你的电脑上了,刚刚提到,这是个在命令行下运行的程序,没有图形界面。

    我们先验证一下 GCC 有没有安装好。

    首先随便打开一个文件夹(桌面也可),按住 shift 键,右击空白处,你会发现右键菜单多了一项“在此处打开命令窗口”,如果你安装了 Windows 10 的最新更新,你看到的会和截图一样,打开的是 PowerShell ,没关系!两个东西除了界面和一些具体的功能不一样,用起来是差不多的。

    snipaste_20170813_002714.png

    snipaste_20170813_002714.png

    打开之后我们发现它提示了我打开的文件夹的路径,路径的后面可以通过键盘输入文字,意思是接下来的命令是基于这个文件夹路径运行的。

    我们在里面输入 gcc 然后回车,如果返回了一个 fetal error: no input files 的错误提示的话,说明 gcc 已经装好并且可以使用了。

    这是默认的 CMD(ps: CMD 是 Windows 希望淘汰但因为兼容旧版不得不保留的东西)

    snipaste_20170813_004227.png

    snipaste_20170813_004227.png

    这是 PowerShell 的效果

    snipaste_20170813_004257.png

    snipaste_20170813_004257.png

    如果返回的是“gcc 不是内部或外部命令,也不是可运行的程序或批处理文件。”的话,说明没装好,可能需要重新试一下,或者是通过重启 Windows 来使 tdm-gcc 集成包安装时给系统设置的环境变量生效。(这里涉及到了“环境变量”的概念,建议主动搜索一下,计算机就是这么一个错综复杂的知识网络呢^_^)

    到这里,文本编辑器和编译器已经准备好啦,接下来我再介绍怎么用它们运行代码。

    补充知识:用户在使用操作系统的过程中,需要与操作系统的内核交互,这个交互的过程,是通过“壳层”来实现的,英文名为Shell。“壳层”主要分为两类,一类是图形界面(GUI:Graphicial User Interface),另一类是命令行界面(CLI:Command-line Interface),作为一名未来的开发者,除了平常使用的图形界面外,高效精准的命令行界面是不能忽视的。PowerShell 与 CMD 一样,都属于 CLI 类型的 Shell 程序。关于 Shell 的更多概念,推荐阅读 鸟哥的 Linux 私房菜 -- 学习 bash shell

    使用方法

    写代码

    没有了IDE的一键编译代码按钮,自然这些操作都需要手动来,听起来很麻烦的样子?

    不用担心!就算是手动,也不会麻烦,至少比你装 Visual Studio 全家桶简单。

    下面让我演示一下在这个环境下,程序是怎么跑起来的。

    首先第一步还是先写写源代码,打开 Atom,点击菜单栏的 File > New File 新建一个文本文件,然后File > Save 定位到一个你想用来放代码的文件夹,文件名取一个后缀为 .c 的名字就好。

    snipaste_20170813_010116.png

    snipaste_20170813_010116.png

    保存之后就可以开始写了,写好再继续保存

    snipaste_20170813_010536.png

    snipaste_20170813_010536.png

    接下来进入放源代码的文件夹,同样的方法,按住Shift在空白处点击右键,打开命令行窗口

    这时候我们运行 gcc 把 first.c 编译成 Windows 可用的可执行文件,命令很简单

    gcc first.c

    ps: 如果你写的是C++,则需要用 g++ 调用GCC的C++编译器而不是 C语言编译器 gcc ,假定源文件是 first.cpp

    g++ first.cpp

    输入完后回车,这时候gcc开始编译你告诉它的文件了,稍等片刻,等这一条命令结束,命令行出现了新的提示符以后,编译就完成了

    snipaste_20170813_011103.png

    snipaste_20170813_011103.png

    我们可以发现,这个文件夹多了个名为 a.exe 的程序,这就是我们编译好以后可以运行的程序了。

    下一步,在命令行里面执行这个程序,输入

    .\a.exe

    发现 PowerShell 窗口里面输出了我想要它输出的字符串,然后程序结束了,再一次出现了新的提示符

    snipaste_20170813_011426.png

    snipaste_20170813_011426.png

    爱动脑筋的同学可能会想,既然是个exe那我就不能双击运行么?

    当然可以,那就双击打开试试!!

    ……

    打开后发现,它弹出一个窗口,但是我还没看清它就消失了,这是为什么呢?

    前文有提到过,我们写的是基于命令行的程序,如果脱离命令行环境直接运行的话,Windows 会创建一个命令行窗口给它提供一个运行的环境,这时候命令行窗口属于这个程序的进程(嗷,这里又扯到了“进程”这个概念了,不明白的话赶紧搜索一下)。这个程序启动后,执行完向命令行打印字符的操作,告诉系统,我已经顺利执行完毕啦,于是它的生命周期结束。自然,Windows 系统要把它之前申请的资源都回起来,包括那个弹出的命令行窗口,于是系统销毁了那个弹出来的命令行窗口。

    当程序在命令行下运行时候,程序使用的命令行窗口属于执行它的命令行窗口的进程(CMD或者PowerShell),程序退出以后,命令行实际还是在运行的,因而窗口不会销毁,程序留下的记录仍然可以得到保留。

    有没有一种双击打开程序不让命令行窗口一闪而过的方法呢?答案是肯定的。如果我们能让程序运行的时候停留在某个步骤不动,那么它就可以保持不退出啦,一般在 Windows 下我们常用的暂停语句是 system("pause"); ,这个语句是通过执行命令行的 pause 命令来实现让程序暂停的功能(和你在命令行输入 pause 回车一样的效果,建议你自己试一试),程序执行到这一步,提示“按任意键继续”,程序暂停,当你按任意键以后,程序才继续向下执行,就不会停不下来立马退出了。

    错误处理

    如果源代码有语法错误的话,编译时编译器会报错并且不会生成目标代码。

    这里我故意把第5行最后的分号删掉,再运行 gcc 命令编译,提示第六行第五个字符的 return 之前少了分号,编译失败。

    snipaste_20170813_011925.png

    snipaste_20170813_011925.png

    错误定位办法参考师兄的文章

    至此,我们可以开始愉快地练习代码啦!

    这里讲两个命令行的小技巧:一是命令行执行过的命令会有历史记录,我们可以通过按上下方向键来切换之前执行过的命令;二是我们填文件名的时候如果它太长了的话,可以先输入前面一小部分,然后按 Tab 键就可以自动补全了。

    命令行中还蕴藏着无限的可能,等待着你的探索。

    最后想说的

    刚开始入门计算机时,可能你会对选择命令行还是图形界面、对学习编程的方式有些迷茫,这里我也试图提供一些相关的信息和我的一些想法,希望可以带来帮助。

    贴一个我在知乎上看到的回答 (原文链接)

    snipaste_20170813_014931.png

    snipaste_20170813_014931.png

    我想,学习一门编程语言,并不是像我们以前学英语那样,总是研究这个语法那个用法而脱离了实际的应用。我们作为计算机专业的学生,学这些东西并不是像别的专业那样为了考证而学,而是应该把它用起来。一门编程语言的很多特性,和实际的应用和系统的运行紧密相关。仅仅盯着语言的语法和表面的东西,大概会像我身边有一些小伙伴一样,光跟着谭浩强课本学了一年的C++语法,到现在还是一头雾水。

    这里也引用一段来自 前言 - Linux C编程一站式学习 的话:

    为什么要在Linux平台上学C语言?用Windows学C语言不好吗?

    用Windows还真的是学不好C语言。C语言是一种面向底层的编程语言,要写好C程序,必须对操作系统的工作原理非常清楚,因为操作系统也是用C写的,我们用C写应用程序直接使用操作系统提供的接口。既然你选择了看这本书,你一定了解:Linux是一种开源的操作系统,你有任何疑问都可以从源代码和文档中找到答案,即使你看不懂源代码,也找不到文档,也很容易找个高手教你,各种邮件列表、新闻组和论坛上从来都不缺乐于助人的高手;而Windows是一种封闭的操作系统,除了微软的员工别人都看不到它的源代码,只能通过文档去猜测它的工作原理,更糟糕的是,微软向来喜欢藏着揶着,好用的功能留着自己用,而不会写到文档里公开。本书的第一部分在Linux或Windows平台上学习都可以,但第二部分和第三部分介绍了很多Linux操作系统的原理以帮助读者更深入地理解C语言,只能在Linux平台上学习。

    Windows平台上的开发工具往往和各种集成开发环境(IDE,Integrated Development Environment)绑在一起,例如Visual Studio、Eclipse等。使用IDE确实很便捷,但IDE对于初学者绝对不是好东西。微软喜欢宣扬傻瓜式编程的理念,告诉你用鼠标拖几个控件,然后点一个按钮就可以编译出程序来,但是真正有用的程序有哪个是这么拖出来的?很多从Windows平台入门学编程的人,编了好几年程序,还是只知道编完程序点一个按钮就可以跑了,把几个源文件拖到一个项目里就可以编译到一起了,如果有更复杂的需求他们就傻眼了,因为他们脑子里只有按钮、菜单的概念,根本没有编译器、链接器、Makefile的概念,甚至连命令行都没用过,然而这些都是初学编程就应该建立起来的基本概念。另一方面,编译器、链接器和C语言的语法有密切的关系,不了解编译器、链接器的工作原理,也不可能真正掌握C的语法。所以,IDE并没有帮助你学习,而是阻碍了你学习,本来要学好C编程只要把语法和编译命令学会就行了,现在有了IDE,除了学会语法和编译命令,你还得弄清楚编译命令和IDE是怎么集成的,这才算学明白了,本来就很复杂的学习任务被IDE搞得更加复杂了。Linux用户的使用习惯从来都是以敲命令为主,以鼠标操作为辅,从学编程的第一天起就要敲命令编译程序,等到你把这些基本概念都搞清楚了,你觉得哪个IDE好用你再去用,不过到那时候你可能会更喜欢vi或emacs而不是IDE了。

    Windows 系统相对更加强调图形化一些,图形化优势在于直观。但也容易让人迷惑,总是贪图着简单方便,不求甚解,大概会更加地趋于平庸。Unix系列的 Linux 强调效率,在命令行方面做的是非常地完善好用。

    关于命令行和图形化哪个好的问题,需要结合具体的应用场景来看待,在不同的场景中它们各有各的利弊。

    私以为图形界面比较适合做一些强调直观的工作,比如说多媒体编辑,类似PS、视频、音频编辑等。类似“让照片里面的妹纸脸上的痘痘消失”这样子的需求,要做这个工作,你总不可能用命令行输入一个个像素去调吧。

    对于编程开发这样大部分时间需要高度精确、且经常遇到重复操作的工作来说,命令行更加适合一些。修改命令参数,再执行一次命令,与每次都要弹个窗口修改,然后点击确定按钮这一连串操作相比,显然要简单舒服许多。

    引用一则著名的文章:《无名师的GUI论》 (原文:Master Foo Discourses on the Graphical User Interface )

    一晚,无名师和Nubi参加一个程序员的探讨会。有个程序员问Nubi和他的老师来自哪所学校。当得知他们是Unix大道的追随者时,程序员颇为不屑。 “Unix命令行工具太粗糙太落后”,他讥讽道。“现代的、设计得当的操作系统可以在图形用户界面中做任何事情。” 
    无名师一言不发,只是指着月亮。旁边的一条狗对着他的手狂吠。 “我不明白。”程序员说。 无名师依然缄默,指着一幅佛祖像,然后又指着一扇窗。
    “你想说什么?”程序员问。 无名师指着程序员的头,接着指着一块大石。 “请把话说清楚!”程序员要求道。 
    无名师深深蹙眉,轻拍程序员的鼻子两下,把他扔到旁边的垃圾箱中。 程序员试图从垃圾堆挣扎出来之时,那条狗跑过来在他身上便溺。 
    此时,程序员眼中一亮。

    使用命令行真的比使用可视化界面好吗?- 知乎

    或许有人会说,大家都在用 Windows,VC,我为什么要折腾这些?放眼望去,计算机在不断地高速发展变化之中,而学院的课程总是在“照顾”着大多数人,如果你仅仅只是跟着学院安排的课程,按部就班地学,那是远远不够的。计算机科学是一门自主性非常强的学科。需要锻炼自己的自学能力。所以也希望大家可以多多折腾,互相多多交流,多多进步。

    遇到困难的时候,我们有互联网,还有一群热爱折腾的小伙伴们和热心的老师,所以放心大胆地去干吧!

    如果有什么疑问的话,希望可以尽快提出。

     

    转自:https://blog.izgq.net/archives/841/

     

    展开全文
  • 如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大。我写这篇文章并不是想贬低windows下面开发的人...
    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大。我写这篇文章并不是想贬低windows下面开发的人,做windows开发的人看了可能会感觉不舒服,我并不是这个意思,我只是说说我自己的感受,我最早开始学习编程也是在windows下面的, 学的是VB,后来转到VC++,当时用的是VC6.0, 做windows下面的开发5年后转入linux下面做开发的,开始在linux下面做开发的时候, 也做过很多windows下面的项目,在linux下面做开发确实比我在windows下面做开发多学到了很多的东西,从开源代码里面吸取了丰富的营养,我不是说我是个高手, 只是说在linux下面学习,你会进步的更快。
    不过我需要强调一下,我这里说的是 “大部分情况下”,意思就是说“在同样勤奋,同样努力程度,同样基础知识,同样工作年限,同样是做应用程序的开发” 的情况下,如果说的不对,希望大家在下面发表看法。
    可能大家会奇怪, 为何会出现这种情况呢 ?
    听我慢慢道来!
    第一:闭源与开源
    windows下面的程序基本都是封闭源代码的,特别是10年前,在windows下可以说找不到可用的开源的软件,现在的情况比以前好多了, 很多linux下面开源的程序被移植到windows下面来,但是linux下面开源的程序增加的更多了。
    以前在windows下面写应用程序, 需要用到MFC,WINSOCK,ODBC,FILE  IO等, 可以找资料的地方主要是微软官方的文档MSDN,也只有MSDN才是最全的地方,下来是第三方网站 vckbase, CSDN, codeproject 这几个网站。 但是从这些网站找到的代码,都是针对一个特定的小功能,为了演示如何实现这个小功能而写的代码,写代码的水平参差不齐,风格各异,都是一些demo性质的小东西,简单研究看看代码就可以集成到自己的应用程序里面。如何构建一个完整的应用程序, 架构良好的应用程序, 大学里面不会教你, 一切都得靠自己摸索,在公司里面做项目获得提升,直到项目商用,后期维护修改代码时, 回头看自己写的代码, 才深刻体会到,自己当时写的代码架构是多么的不合理,维护修改是如此的困难。如果在互联网上找不到自己需要的资料,就只能靠自己想一些实现的方法,虽然功能完成了, 可能完成的时候还很有成就感,但是等那天你突然发现有人实现这个功能,并且用了一个巧妙的方法, 这是你才突然恍悟, 我当时为何就想不到这么实现呢? 在windows下面开发, 不太容易找到可以参考的类似你要完成功能的开源项目。一切都得靠自己。但是在linux下面就不一样了, 当你要开发一个新项目时, 可以想想有没有什么开源项目也完成了类似的功能, 可以下载到源代码来做一个参考, 对其中的算法, 架构设计等做一个详细的了解,然后自己开发的时候就会比较得心应手了,可以避免别人犯过的错误,少走很多弯路。
    第二:要学习的知识量不一样
    学习window下的开发, 你需要学习很多的Windows API,截止到2009年9月,Windows总API数量为2258个, 并且Windows API 的参数多, 参数类型复杂,要记住这么多东西不是一件容易的事情,至少也和学习一门外语一样,大学英语四级要求掌握的总词汇量达到4500个单词。可想而知, 学会这么多的API用法,有多难了吧。那么学习linux下, 要掌握多少API呢 ? linux下的内核API, 全部算下来也才335,但是这些内核的API只有编写驱动的时候才能用到, 开发应用程序基本用不到内核的API,开发应用程序的API基本都是C的API,而 Linux所有的C的API个数是279个, 也就是说你只需要掌握不到300个的API, 就可以顺利的在linux下面开发应用程序了,相比学习windows下面的那一堆API来说, 你是不是可以省下很多时间来学习其他知识呢?
    下面我就举个简单的例子:
    上面这些API是windows下面对文件操作的API, 总共是8个,看看CreateFile的参数吧,
    __in HANDLE hTemplateFile)
    这些参数的意义和类型, 请问你需要花多少时间来掌握呢 ?
    我们在看看linux下面对文件操作的C的API有几个,
    fopen, fwrite, fread, fclose 共四个,我们在看看参数吧
    FILE *fopen( const char *filename, const char *mode );   两个参数, 请问你需要花多少时间掌握呢。
    可能有的人会提出意见,说上面C的API也能在windows下面运行啊? 没错, 是能在windows下面运行,但是你就掌握这跨平台的C的API够吗? 难道所有在windows下面开发的人都喜欢用C的API, 不会用windows本身的API吗?你不需要学习windows下面的API吗? 你的同事使用了CreateFile这个函数, 你不需要搞懂他吗? 你不需要看同事的代码吗? 你不需要去维护别人写过的代码吗?
    如果你还是这么想,那我还可以再举其他例子!就拿创建线程的例子吧,下面是2个在windows下面创建线程的例子, 第一个是创建安全工作线程, 第二个是创建界面线程,还有一个函数我没有放下面, 是创建不安全的工作线程的,具体的原理大家可以参考《win32多线程程序设计》,
    作者:(美)Jim Beveridge & Robert Wiener 著,侯捷 译 这本书。
    //线程安全的工作线程函数
    //界面线程函数
    HANDLE WINAPI CreateThread(   __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,   __in          SIZE_T dwStackSize,   __in          LPTHREAD_START_ROUTINE lpStartAddress,   __in          LPVOID lpParameter,   __in          DWORD dwCreationFlags,   __out        LPDWORD lpThreadId )
    做windows下面的开发, 上面两个创建线程的函数我们都必须掌握。当然了, 你也可以只需要知道 _beginthreadex 来在windows下面通吃,但是当看到别人的代码使用CreateThread的时候, 你可不要不习惯,MFC里面很多人都用CreateThread。 掌握这么多的API累吧 ?  就和你上学的时候背单词一样累。
    下面我在列一下linux下面创建线程的函数
    int pthread_create( pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg)
    看到了吧, 你只需要知道这个就可以了。
    C的API 绝大部分都可以再windows下面运行,在windows下面学习开发, 你不但要懂得C的API, 你还需要多花时间来学习windows系统本身的API, 你可能要说, 这么说应该是windows下面学得多啊, 我要说的是你掌握的API是很多, 但是对于一个软件来说, 最最重要的是系统架构,数据结构,架构设计的好, 对后期的代码维护,功能修改都很关键, 这也就是新手写的代码, 到最后连他自己本人都很难维护的原因, 更别说让别人来维护了。
    API相当于基本功, 系统架构, 数据结构是内功,基本功练的越快,我们就越有更多的时间来练习内功。练习内功,我们要多向高手学习。
    在学习windows 下面开发应用的道路上, 我们需要掌握更多的API, 学习后, 让我们的路越走越窄, 没有特别丰富的开源代码可以参考, 水平提高的速度很慢。
    可喜的是, 现在很多开源的项目被很多人移植到了linux下面, 也有很多的开源项目是跨平台的, 常用的是 wxWidget界面库, 用法类似MFC, 还有qt这个界面库, 也很强大,还有开源的3D引擎OGRE, 架构非常好,很值得学习其架构模式。但是linux下面的开源库要远远比windows下面的开源库丰富得多, 我们可以方便的从高手的代码里面学习数据结构,学习设计模式,学习编程技巧,这也就是linux下面的程序员, 可能会比windows下面的程序员水平更高的原因, 毕竟见多识广嘛, 熟读唐诗三百首,不会作诗也会吟啊!
    展开全文
  • 数十年来,它一直是数据中心的重要参与者,尽管很难找到明确的操作系统市场份额的报告,但Linux在数据中心操作系统上的份额可能高达70%,而Windows变体几乎涵盖了所有剩余的比例。使用任何主流公共云的开发人员可以...
  • 之前讲gcc编译的时候,参看:C语言再学习 -- GCC编译过程 提到过静态库和共享库,那时只是简单的讲了它们相关的编译链接,接下来就该详细介绍它们了。不过再讲解之前还需了解一下编程相关的环境变量。一、环境...
  • 初识UNIX操作系统

    2019-06-09 21:07:39
    ​ 与大家熟悉的Windows用户界面和使用习惯不同,Unix是常使用命令运行、极具灵活性的操作系统,目前的产品主要有IBM-AIX,SUN-Solaris、HP-UNIX等。初期接触Unix操作系统,下列的问题几乎是常遇的:由图形界面操作...
  • 背景:公司网络环境较为复杂,服务器权限管理极为严格,所以在进行Linux的脚本开发时出现诸多不便,例如:没有root权限;没有emacs,vim等开发工具。环境:惠普笔记本(注意红色箭头指向的地方)OS Build 需要大于...
  • WINDOWS下如何安装GCC

    2018-10-09 13:14:34
    GCC 是一个原本用于 Unix-like 系统编程的编译器。不过,现在 GCC 也有了许多 Win32 的移植版本。所以,也许对于许多 Windows 开发者来说, GCC 还是一个比较陌生的东西。所以,我希望通过这章的叙述,让你——...
  • Unix基础教程

    2006-12-10 18:08:00
    这篇东西是关于Unix系统操作的教程。也是Unix的入门教程。如果你有兴趣学,请看下去,保证你可以学到许多有用的东西。如果你满足于dos,windows的操作,不想对网络服务器,有任何了解的话,可以不看。因为你并不想...
  • LINUX学习:UNIX域协议

    2019-09-26 02:19:24
    UNIX域套接字与TCP套接字相比较,在同一台主机的传输四度前者是后者的两倍 2.UNIX域套接字可以在同一台主机上各进程间传递描述符 3.UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述。 UNIX域地址结构 #...
  • 根据《linux/UNIX系统编程手册》的daemon章节写的一个测试become_daemon()函数程序。代码内容99%以上都是书上给的源码。此处仅注释掉不需要的内容,以及为了简化理解,做了不同平台的适配,(对于源码来说是种倒退,...
  • 在学校接触的都是简单的windows开发,根本没有unix开发,毕业设计还是windows开发,但是找的工作呢,是UNIX环境的,早知道选公司给的题目了了。如此尴尬的境地,但是这两者都是熟悉不熟悉的问题而已,无论是哪个核心...
  • Unix操作系统的入门与基础 与大家熟悉的Windows用户界面和使用习惯不同,Unix是常使用命令运行、极具灵活性的操作系统,目前的产品主要有IBM-AIX、SUN-Solaris、HP-UNIX等。初期接触Unix操作系统,下列的问题几乎是...
  • Unix操作系统的入门与基础  与大家熟悉的Windows
1 2 3 4 5 ... 20
收藏数 15,216
精华内容 6,086
热门标签