【生意多】-免费发布分类信息
当前位置: 首页 » 新闻 » 教程 » 正文

LINUX程序设计

放大字体  缩小字体 发布日期:2020-07-05 06:17:05    浏览次数:15
导读

  授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!  授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!  授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户

  授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!

  授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

  授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

  《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。

  在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。

  版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

  ./hello,指示shell去执行当前目录下给定名称的程序。如果不包含./,且PATH变量不包含指向你的主目录的条目,shell就找不到hello程序。

  应用程序 一般在usr/local目录结构下编译、运行自己的程序,因为它分离了厂商提供及后续添加的文件与系统本身提供的应用程序。

  (1)用头文件来提供对常量的定义和对系统及库函数调用的声明,几乎都在usr/include目录及其子目录下。

  (2)用-I标志来包含保存在子目录或非标准位置中的include文件,它指示编译器不仅在标准位置,也在该目录下查找fred.c包含的头文件。

  (2)标准库文件一般存储在/lib或/usr/lib目录中,C语言编译器需要知道要搜索哪些库文件,仅把库文件放在标准目录中,然后希望编译器找到它是不够的,库文件必须遵循特定的命名规则并且要在命令行中明确指定。

  (2)查看目标文件、函数库或可执行文件中包含的函数,我们可用nm命令,可以看到libfoo.a中包含fred和bill两个函数,而program里只包含函数bill。创建程序时,它只包含函数库中它实际需要的函数,虽然程序中的头文件包含函数库中所有函数的声明,但这并不将函数库包含在最终的程序中。

  (3)通过这种方法,系统可只保留共享库的一份拷贝并供许多应用程序同时使用,并且在磁盘上也仅保存一份,另一个好处是共享库的更新可以独立于依赖它的应用程序。

  continue命令:使for、while、until;循环跳到下一次循环继续执行时 .命令 用来执行当前shell中的命令。

  通常,当一个脚本执行一条外部命令或脚本程序时,会创建一个新的环境(一个子shell),命令将在这个新的环境中执行,在命令执行完毕后,这个环境被丢弃,只留下退出码返回给父shell,而外部的source命令和点命令在执行某个脚本程序中所列出的命令时,使用的是调用该脚本程序的同一个shell。 通常被调用命令对环境变量做出的任何改变都会丢失,而点命令允许执行的命令改变当前环境。

  exec命令 :将当前shell替换为一个不同的程序,因此脚本程序exec命令后的代码都不会执行。

  exit n命令 :使脚本以退出码n结束运行,如果在任何一个交互式shell的命令提示符中使用这个命令,它就会让你退出系统。如果你允许自己的脚本程序在退出时不指定一个退出状态,那么该脚本中最后一条被执行的指令的状态将被最为返回值。

  export命令 :Export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效。

  return 命令 :使函数返回,如果没有指定参数,return命令默认返回最后一条指令的退出码。

  set命令 :Set命令的作用是为shell设置参数变量。许多命令的输出结果是以空格分隔的值,如果需要使用输出结果的某个域(例如$1,$2,…),这个命令就十分有用。

  shift命令 :shift把所有参数变量左移一个位置,使$2变为$1,$3变为$2,$1的值被丢弃。在扫描处理脚本程序的参数时经常用到shift命令。

  trap命令 :用于指定在接收到信号后将要采取的操作,trap命令的参数分为2部分,前一部分是接收到指定信号时将要采取的操作,后一部分是要处理的信号名。

  unset命令 :从环境变量中删除变量或函数,这个命令不能删除shell本身定义的只读变量(如IFS)

  (1)$(commend):执行一条命令并把该命令的输出放到一个变量中。 (2)$((…)),算术扩展:

  在shell脚本程序中向一跳命令传递输入的一种特殊方法是使用here文档,它允许一条命令在执行时就好像是在读取一个文件或键盘一样,而实际上是从脚本程序中输入数据。

  (1)文件,除了本身包含的内容外,还会有“管理信息”,例如文件的创建/修改日期和它的访问权限。这些属性被保存在文件的inode数据结构中,它是文件系统中的特殊的数据块,它同时还包含文件的长度和文件在磁盘上的位置。

  B)/dev/tty:如果一个进程有控制的话,那么特殊文件/dev/tty就是这个控制终端(键盘或显示屏)的别名。

  C)/dev/null:空设备,所有写向这个设备的输出都将被丢弃,而读这个设备会立刻返回一个文件尾标志。

  (3)设备可分为字符设备和块设备,两者的区别在于访问设备时是否要一次读写一整块。块设备是那些支持随机文件系统存取的设备,例如硬盘。

  (1)每个运行中的程序称为进程,它有一些与之关联的文件描述符,你可以通过它们访问打开的设备或文件。

  (1)open建立了一条到文件或设备的访问路径,如果操作成功,它将返回一个文件描述符,这个文件描述符是唯一的,它不会与任何其它运行中的进程共享。如果两个程序同时打开同一个文件,会得到两个不同的文件描述符。

  (2)Open调用失败时返回-1,并设置全局变量errno以指明失败的原因,新文件描述符总是使用未用描述符的最小值。

  (3)Oflags参数是通过主要文件访问模式与其他可选模式的结合来指定的,必须指定的访问模式。

  (4)oflags使用O_CREAT标志的open来创建文件时,必须使用有三个参数形式的open调用。

  B)Open调用里给出的模式值将与当时的用户掩码的反值做AND操作,因此open调用中的标志实际上是设置文件访问权限的要求,所请求的权限是否被设置取决于当时umask的值。

  (1)close调用终止一个文件描述符fildes与其关联的文件之间的关联,文件描述符被释放并能够重新利用,close调用成功则返回0,出错则返回-1。

  (1)ioctl提供了一个用于控制设备及其描述行为和配置底层服务的接口,终端、文件描述符、套接字甚至磁带都可以有为它们定义的ioctl。Iostl的原型:

  (2)unistd.h必须最早出现,因为它根据POSIX规范定义的标志可能会影响到其他的头文件。

  lseek系统调用 对文件描述符fildes的读写指针进行设置,可以用来设置文件的下一个读写位置。读写指针既可设置为文件中的某个绝对位置,也可以把它设置为相对于当前位置或文件尾的某个相对位置。 所有打开的文件都有一个当前位置偏移量,读写通常会使CFO增大,文件打开时,CFO被初始化为0,除非使用了O_APPEND。

  标准I.O库及其头文件stdio.h为底层系统调用提供了一个通用的接口,这个库已经成为ANSI标准C的一部分,而我们前面见到的系统调用却还不是。 在标准I/O库中,与底层文件描述符对应的对等物叫做流,它实现为指向FILE的指针。 在启动程序时,有三个文件流是自动打开的,它们是stdin、stdout和stderr。

  int gerchar() 从文件流里取出下一个字节并把它作为一个字符返回,当到达文件尾或出现错误时,返回EOF,必须通过ferror或feof来区分这2种情况。 gerchar()从标准输入中读取下一个字符。

  (3)出现错误:fgets返回一个空指针并设置errno给出错误的类型。 (4)gets函数从标准输入读取数据并丢弃遇到的换行符,它在接收字符串的尾部加上一个NULL字节。 从输入文件流stream里读取一个字符串,它把读到的字符写到s指向的字符串里,知道出现下面几种情况:遇到换行符、已经传输了n-1个字符、或者指向文件尾。

  ferror:测试一个文件流的错误标识,标识被设置返回非零值,否则返回0。 feof:测试一个文件流的文件尾标识。clearerr:清除由stream指定的文件流的文件尾标识和错误标识。

  (1)错误代码errno的取值在errno.h里。 char* strerror(int errnum) 把错误编码映射为一个字符串,该字符串对发生的错误类型进行说明 void perror(const char* s) 把error变量中报告的当前错误映射到一个字符串,并把它输出到标准错误输出流。

  (1)linux将一切事物看作文件,硬件设备在文件系统中也有相应的条目。/dev目录中的文件使用底层系统调用这样一种特殊方式来访问硬件。 (2)Linux提供了一种特殊的文件系统procfs,它通常表现为/proc目录,该目录包含了许多特殊文件以允许对驱动和内核信息进行高层访问。只要应用程序有正确的访问权限,它们就可以通过读写这些文件来获得信息或设置参数。(3)/proc目录中的文件会随系统的不同而不同。

  B)/etc/bashrc:每个使用bash的用户在登陆以后执行完/etc/profiled中的内容后都会执行此文件,在新开一个bash的时候也会执行此文件 C)~~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登陆时,该文件仅仅执行一次。 ~~

  /.bashrc:该文件包含专用于单人的bash shell的bash信息,当登录时以及每次打开一个新的shell时,该文件被读取。

  C)如果机器被正确配置,并且有足够的交换空间,linux允许应用程序访问比实际物理内存更大的内存空间。

  (2)Linux实现了一个“请求分页的虚拟内存系统”,在程序使用的物理内存地址上并不真实地存在,linux将所有的内存都以页划分,通常每页的大小为4096字节,每当程序试图访问内存时,就会发生虚拟内存到物理内存的转换。当所访问的内存再物理上并不存在时,就会产生一个页面错误,并将控制权转给内核。

  (3)Linux内核会对访问的内存地址进行检查,如果这个地址对于程序来说是合法可用的,内核就会确定需要程序提供哪一个物理内存页面。 如果该页面之前未被写入,就直接分配它。 如果它已经被保存在硬盘的交换空间上,就读取包含数据的内存页面(在硬盘的交换空间上)到物理内存(内存),接着,在完成虚拟内存到物理地址的映射之后,内核允许用户程序继续运行。

  (5)当应用程序耗尽了所有的物理内存和交换空间,或者栈超出了其最大长度时,内核将拒绝此后的内核申请并可能提前终止程序。

  void free(void* ptr_to_free) 动态使用内存的程序应该总是用free调用来把不同的内存释放给malloc内存管理器,这样做可以将分散的块重新合并到一起,并由malloc函数库来管理它。

  (1)锁文件仅仅是充当一个指示器的角色,程序间需要通过相互协作来使用它们。锁文件只是一个建议性锁,与此独立的是强制性所。

  (2)需要调用带了O_CREAT和O_EXCL标志的open系统调用,这使我们能以一个原子操作完成两项工作:确定文件不存在,然后创建它。

  (2)Linux允许许多用户同时访问系统,每个用户可以同时运行许多个程序,甚至同时运行同一个程序的许多个实例,系统本身也运行着一些管理资源和控制用户访问的程序。

  (3)正在运行的程序或进程由程序代码、数据、变量(占用着系统的内存)、打开的文件(文件描述符)和环境组成。

  (4)Linux会在进程之间共享程序代码和系统函数库,所以在任何时刻内存中都只有代码的一份拷贝。

  (1)PID:每个进程都会被分配一个唯一的数字编号,其范围是2到32768,当进程被启动时,系统将按顺序选择下一个未被使用的数组作为PID,而数字1一般是为init保留的。

  (2)Grep将要执行的程序保存在一个磁盘文件中。正常情况下,linux进程不能对用来存放程序代码的内存区域进行写操作,但它可以被多个进程安全地共享。

  C)程序计数器,用来记录它执行到的位置,即在执行线程中的位置,在使用线程时,进程有不止一个执行线)Linux进程表就像一个数据结构,它把加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID,进程的状态,命令字符串和其他一些ps命令输出的各类信息。操作系统能通过进程的PID对它们进行管理。

  (2)Ps默认情况下只显示与终端、主控台,串行口或伪终端保持连接的进行的信息,-a选项查看所有的进程,-f选项显示进程完整的信息。

  (1)一般而言,每个进程都是由另一个我们称之为“父进程”的进程启动的,被父进程启动的进程叫做子进程。LINUX程序启动时,它将运行一个名为init的进程,该进程是系统运行的第一个进程,你可以把init进程看作为操作系统的进程管理器,它是其它所有进程的祖先进程。如果父进程不存在了,则显示的就是init的进程id。

  (2)启动新进程并等待它们结束的能力是整个系统的基础,我们将在本章的后面看到如何从自己的程序中用系统调用fork,exec和wait来完成同样的任务。

  (3)Linux内核用进程调度器来决定下一个时间片应该分给哪个进程,它的判断依据是进程的优先级,优先级高的进程运行得更为频繁,而优先级低的后台任务运行的就不是那么频繁。在linux中,进程运行时间不可能超过分配给它们的时间片,它们采用的是抢先式多任务处理,所以进程的挂起和继续运行无需彼此之间的协作。

  (4)在linux这样的多任务系统中,多个程序可能竞争使用同一资源,这种情况下,执行短期的突发性工作并暂停运行以等待输入的程序,要比持续占用处理器以进行计算或不断轮训系统以查看是否有新的输入到达的程序更好。

  (5)系统根据进程的nice值来决定它的优先级,一个进程nice值默认为0,长期不间断运行的程序的优先级一般比较低,而暂停以等待输入的程序会得到奖励。这可以保证与用户进行交互的程序保持及时的响应性。

  (2)“ps -ax” 与 “ps -ax &”的区别:前一个必须等待由system函数启动的线程结束后才能继续,而后一个shell的命令是在一个后台运行程序的请求,所以ps程序一启动shell就返回了。

  (3)一般来说,启动system函数远非是启动其它进程的理想手段,因为它必须用一个shell来启动需要的程序,由于在启动程序之前需要先启动一个shell,而且对shell的安装情况及使用的环境的以来也很大。

  (3)以字符p结尾的函数通过搜索PATH环境变量来查找新程序的可执行文件路径,如果可执行文件不在PATH定义的路径中,需要使用绝对路径传递参数。

  (4)全局变量environ可用来把一个值传递到新的程序环境中,此外,函数execle和execve可以通过额外的参数envp传递字符串数组作为新程序的环境变量。

  (5)运行中的程序开始执行exec调用中指定的代码,新进程的PID,PPID和nice值与原先的完全一样。

  (7)由exec启动的新进程继承了原进程的许多特征,特别是,在原进程中已打开的文件描述符在新进程中仍然打开,任何在原进程中打开的目录流都将被关闭。

  (2)我们可以调用fork()创建一个新进程,这个系统调用复制当前进程(包括指令、变量值、程序调用栈,环境变量、缓冲区等),在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的,新进程几乎与原进程一模一样,执行的代码也完全相全,但新进程有自己的数据空间、环境和文件描述符。

  (1)在父进程中调用wait函数让父进程等待子进程的结束,wait将暂停父进程的直到它的子进程结束为止,这个调用返回子进程的PID,如果stat_loc不是空指针,则状态信息就被写入它所指向的位置。

  (2)信号是由于某些错误条件而产生的,如内存段冲突、浮点处理器错误或非法指令等,它们由shell和终端管理器生成以引起中断,它们还可以作为在进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。

  (3)如果进程接收到这些信号中的一个,但事先没有安排捕获它,进程就会终止。通常,系统将生成核心转储文件core,并将其放在当前目录下。该文件是进程在内存中的映像,它对程序的调试很有用处。

  C)SIGINT(终端中断):在键盘上敲入终端字符,就会向前台进程(即当前正在运行的进程)发送SIGINT信号,这将引起该程序的终止,除非它事先安排了捕获这个信号。

  E)Killall命令允许我们发送信号给运行着同一命令的所有进程。 signal Sig:准备捕获或忽略信号。 Func:接收到指定的信号后将要调用的函数,或选择SIG_IGN,SIG_DEL。 返回值:先前用来处理这个信号的函数。

  (1)要想发送一个信号,两个进程必须拥有相同的用户ID,超级用户可以发送信号给任何进程。 Alarm 在预定时间后,发送一个SIGALARM信号。将seconds重新置为0将取消所有已设置的闹钟请求,如果在接收到SIGALRM信号后再次调用alarm函数,则闹钟重新开始计时。 pause() 在安排好捕获信号后暂停运行,直到收到一个信号为止。这意味着程序不需要总是在执行着,程序不必在一个循环中无休止地检查某个时间是否已发生,相反,它可以等待时间的发生。

  A)有时,让程序看起来好像是在同时做两件事是非常有用的。例如,在编辑的同时对文档中的单词个数进行实时的统计或者是多线程的数据库服务器,如果用多进程的方式来完成将很难做到高效率,因为各个不同的进程需要紧密合作才能满足加锁的和数据的一致性。

  a12.2 第一个线)在一个多线程程序里,只有一个errno变量供所有的线)类似的问题还存在于fputs之类的函数中,这些函数通常用一个单独的全局性区域来缓存输出数据。

  (1)a_thread:线程被创建时,这个指针指向的变量中将被写入一个标识符,用该标识符来引用新的进程。 (2)Thread_function:线程将要启动的函数。 (3)Message:传递给函数的参数。

  A)互斥量用于线程的互斥,信号量用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 互斥:是指同一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性,但互斥无法限制访问者对资源的访问顺序,即访问时无序的。 同步:是指在互斥的基础上,通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的,少数情况是指可以允许多个访问者同时访问资源。

  B)针对每个popen调用,不仅要启动一个被请求的程序,还要启动一个shell,即每个popen将启动两个进程。

  (2)写到file_descriptor[1]的所有数据都可以从file_descriptor[0]读回来,数据基于先进先出的原则。

  (3)当用fork调用创建新进程时,原先打开的文件描述符仍然保持打开状态,如果在原先的进程中创建一个管道,然后再调用fork创建新进程,我们即可通过管道在两个进程之间传递数据。

  (1)如何在子进程中运行一个与其父进程完全不同的程序。我们用exec来完成这一工作,并将文件描述符作为一个参数传递给用exec启动的程序。

  (2)打开FIFO文件的另一点区别,对open_flag的O_NONBLOCK选项的用法,使用这个选项不仅会改变open调用的处理方式,还会改变对这次open调用返回的文件描述符进行的读写请求的处理方式。

  C)对一个完全阻塞FIFO的write调用将等待,直到数据可以被写入时才继续进行,如果写入的数据长度小于PIPE_BUF,那么或者写入全部字节,或者一个字节都不写入。(如果有几个不同的程序尝试同时向FIFO写数据,要是能保证所有的写请求是发往一个阻塞的FIFO的,并且每个写请求的数据长度小于等于PIPE_BUF字节,系统就可以确保数据不会交错在一起)

  D)如果FIFO被设置为非阻塞模式,它将按下面的规则: 如果请求写入的数据的长度小于PIPE_BUF字节,调用失败,数据不能写入。 如果请求写入的数据的长度大于PIPE_BUF字节,将写入部分数据,返回实际写入的字节数,返回值也可能是0。

  介绍信号量PV操作,P(-1)挂起进程,V(+1)释放进程,共享内存把不同进程之间共享的内存安排为同一段物理内存,这样可以在不同进程之间传递数据,消息队列独立于发送和接收进程而存在,创建消息队列、添加消息到消息队列、从消息队列获取消息、控制消息队列完成进程间的通信。

  (1)当临界区可用时,信号量变量sv的值是true,然后P操作将它减1,使他变为false以表示临界区正在使用;当进程离开临界区时,使用V操作将它加1,使临界区域再次变为可用。注意,简单地用一个普通变量进行类似的加减法时不行的,因为在C/C++或几乎任何一个传统的编程语言中,都没有一个原子操作可以满足检测变量是否为true,如果是再将该变量设为false的操作,这也是信号量如此特殊的原因。

  (1)共享内存为多个进程之间共享和传递数据提供了一种有效的方式。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。一种典型的应用时,我们用共享内存来提供对大块内存区域的有效访问,同时通过传递小消息来同步对该内存的访问。

  (2)共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的地址,如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何进程看到。

  (4)第一次创建共享内存段时,它不能被任何进程访问。要想启用对该共享内存的访问,必须将其连接到一个进程的地址空间中,这项工作由shmat函数来完成。

  (2)消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。而且,每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据块。

  (1)Linux文件系统是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的API函数,Linux可以在许多存储设备上支持许多文件系统。例如,read函数调用可以从指定的文件描述符读取一定数量的字节,但read函数不了解文件系统的类型。

  (2)文件系统是对一个存储设备上的数据和元数据进行组织的机制,由于存在多种类型,因此Linux将文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。

  (3)在Linux中将一个文件系统与一个存储设备关联起来的过程称为挂装。使用mount命令将一个文件系统附着到当前系统中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。 高层体系结构:用户空间和内核中与文件系统相关的主要组件

  E) 缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度,以最近使用列表(LRU)的形式管理缓冲区缓存。

  A) 超级块在每个文件系统的根上,超级块描述和维护文件系统的状态,包含文件系统名称,文件系统的大小和状态,块设备的引用和元数据信息(比如空闲列表等)。超级块通常存储在存储媒体上。 超级块中的一个重要元素是超级块操作的定义(super_operations),这个结构定义一组用来管理这个文件系统中的inode的函数。

  B) 文件系统中管理的每个对象(文件或目录)在Linux中表示为一个inode,它具有唯一资源标识符,inode包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。

  C) dentry用来实现名称和inode之间映射,有一个目录原来缓存最近使用的dentry。dentry还维护目录和文件之间的关系,从而支持在文件系统中移动。

  计算机的基本组成:处理器主存储器输入输出模块系统总线标准C的IO输出有三种缓存类型全缓存:对于磁盘通常使用全缓存操作行缓存:终端的标准输入输出 两种情况下航缓存会输出:1)行缓存满自动输出。2)碰到换行符自动输出无缓存 标准作物输出通常是不带缓存的是为了错误信息能够尽快的显示出来使用实例证明printf后面不加回车,那么行缓存将不会输出自读到屏幕上://程序一直运......

  指令压缩解压缩指令2. sed指令3. awk指令4. 软件安装与配置5. C++6. Java7. Python8. Shell新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可......

  是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支......

  1. 管道和重定向文件描述符0:一个程序的标准输入文件描述符1:标准输出文件描述符2:标准错误输出操作符:把标准输出重定向到一个文件。操作符:将输出内容附加到一个文件中。操作符:连接进程。2. 作为

  此篇为学习完《数据结构与算法之美》后,在LeetCode刷题的汇总目录,方便大家查找(Ctrl+Find),一起刷题,一起PK交流!另有解题:《剑指Offer》、《程序员面试金典》、LintCode代码能力测试CAT。如果本文对你有帮助,可以给我点赞加油!已解决 1200/1701 - 简单 459 中等 630 困难 111...

  ~/表示在用户目录Home下 /表示可以进入和home同等级的其他路径,例如 cd /bin进入二进制文件目录 cd /home/wjj进入命令行的默认路径 进入其他用户:~/home/usrname 搜索路径(可以自己添加)有系统管理员配置 /:根目录,包含了几乎所有的文件目录,相当于中央系统,cd / /boot 引导程序,内核等的存放目录,例如f调整启动的默......

  系统发行版本中都包含了多种shell。目前使用的最为广泛的shell包括bash、TC shell和Korn shell。通常默认的登录shell是bash。系统管理员可以为你指定使用哪种shell作为登录shell,也可以通过命令来改变自己的默认登录shell。常用shell程序 shell的环境变量shell环境变量具有特殊的意义,它们的名字一...

  的特点和原则以及编码风格等。通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了解。1.1Linux简 介

  是能够自由传播并继承了UNIX内核的操作系统,是对UNIX的简化和改进,它既保留了UNIX系统的高安全性...

  这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。

  课程分为两条主线从Tensorflow的基础知识开始,全面介绍Tensorflow和Keras相关内容。通过大量实战,掌握Tensorflow和Keras经常用到的各种建模方式,参数优化方法,自定义参数和模型的手段,以及对训练结果评估与分析的技巧。 2从机器学习基础算法开始,然后进入到图像分类领域,使用MNIST手写数据集和CIFAR10图像数据集,从简单神经网络到深度神经网络,再到卷积神经网络,最终完成复杂模型:残差网络的搭建。完成这条主线,学员将可以自如地使用机器学习的手段来达到图像分类的目的。

 
关键词: linux设计
(文/小编)
打赏
免责声明
• 
本文为小编原创作品,作者: 小编。欢迎转载,转载请注明原文出处:http://www.31duo.com/news/show-357899.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
 

(c)2016-2019 31DUO.COM All Rights Reserved浙ICP备19001410号-4

浙ICP备19001410号-4