-
2017-03-01 17:31:10作者:方春根
链接:https://www.zhihu.com/question/26031045/answer/35980197
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题主的意思不是问“Linux好处都有啥,谁说对了不给他”(escape根据题主描述题主应该压根不清楚计算机的体系结构那么有点基本开发经验的我可以简单讲讲关于题主的疑惑了:1,为什么无人机多用Linux系统?无人机,为了实现无人功能,就需要实现对飞机的远程操控。那么,最简单的方式就是在无人机上部署一个计算机来指挥无人机的行动过程。因为飞行器尺寸的限制,飞行器上的计算机需要可靠,低能量消耗以及尺寸比较小,那么arm处理器就比较符合这些原则了。如果题主研究过物联网相关的玩意,会发现这方面工程师很喜欢用树莓派或者其他的arm计算机实现一个“中控中心”的设计,淘宝上就可以买到一套完整的基于Arduino开源工程的无人飞行器的元件。也就是说,只要你有好的想法,你都可以通过现有的工具零件搭建出一个原型来实践。硬件有了,arm计算机,计算机是由软件和硬件组成的,软件呢?Linux平台上的各种操作系统。为什么选用Linux平台的操作系统?首先,对性能的要求比较低,符合低功耗要求。前人栽树,后人乘凉,linux平台上已经很多的“轮子”,即第三方库,很多现成做好的功能,拿过来就可以用,比如说安卓系统对定位功能的封装。(其实是满大街linux嵌入式开发工程经验。。。前人的开发经验最宝贵嘛)另外,linux对底层硬件的可操作性也是一等一的。(具体请见内核编程、驱动程序开发等书籍)总结一下,arm计算机适合用来作为电子积木搭建工程原型,linux平台比较适合arm计算机,所以就造成了“其中有很多无人机项目都是用 Linux 代码编写的”。2,(1)意思是Linux代码能来编程吗,Linux是内核,使用Linux内核的系统都可以被称作Linux系统。操作系统本身不是开发工具,不会出现用Linux代码编程这种事情。shell脚本不算,因为shell本身也是一种交互语言嘛。(2)我上网查了下Linux代码,好像和C语言差不多本来Linux就是用c搞的3,前面讲了,Linux是操作系统,题主也知道c语言。那么语言编好了程序,程序一般需要操作系统的支持下来运行,你写一个printf("hello world"),在萌萌哒的vc6下会出来个黑框框,在万恶的gcc下面会生成一个out文件。编程语言的表现是基于操作系统上的,那么在Linux下用c或者其他语言对无人机编程有什么优点?简答:1,操作系统本身低功耗不占用太多能源动力。2,第三方库有很多,从网络操作到硬件掌控,都有现成的轮子。3,对底层硬件的掌控性非常好,没有轮子,内核编程编出来个轮子也可以。4,arm和linux相依为命,约定俗成。5,除了linux/unix体积小,效率高以外,最重要的我觉得还是它的安全性,因为连内核都是可以重新编译的,完全不用担心后门程序。(感谢老何同志的补充)物联网大牛如有宝贵意见,请留言,在这里先为您的提携说声谢谢。update:别的答案这么喜欢黑windows,无视wince真的没问题更多相关内容 -
黑马程序员linux系统编程视频配套文档
2018-12-09 22:23:36黑马程序员linux系统编程配套课件文档,进行了详细的处理,分类,整合 -
Linux-UNIX系统编程手册.pdf
2019-10-17 11:43:02该资源是很好的学习Linux/Unix编程的手册,看豆瓣书评挺高的就先自己下载看一下,防止自己的文件意外删除,先放到CSDN上,一来可以做一个备份,二来有需要的也可以自己下载(分享才能更好的成长) -
Linux系统编程(第二版)
2015-09-24 16:39:04Linux系统编程(第二版) 英文版 学习Linux编程经典好书,值得多读多看 -
《linux/unix系统编程手册》官方参考源码
2018-04-10 14:18:02本代码是配套《linux/unix系统编程手册》(上下册)使用的 亲测可用。假如在linux虚拟机查看,可直接解压在非共享目录上即可。 -
Linux UNIX系统编程手册(上册)
2016-09-18 08:21:40《linux/unix系统编程手册(上、下册)》是介绍linux与unix编程接口的权威著作。linux编程资深专家michael kerrisk在书中详细描述了linux/unix系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。... -
linux系统编程 pdf 中文版 + 英文版 Linux System Prorgramming
2010-11-17 16:18:04《linux系统编程》描述了使用标准接口包括使用linux独有的高级接口时,在功能和性能之间如何进行权衡取舍的策略。. 该书同样也是一本内行人士编写灵活高效代码的学习指南。作为内核黑客和本书的作者,robert love... -
Linux UNIX系统编程手册(下册).pdf
2017-07-05 12:03:53Linux UNIX系统编程手册(下册).pdf -
LinuxUNIX系统编程手册(英文版)
2014-06-16 08:05:11LinuxUNIX系统编程手册 全部英文版 文字版pdf 有目录 -
免费的 Linux UNIX系统编程手册 pdf
2014-08-07 08:32:51免费的 Linux UNIX系统编程手册 pdf -
LINUX.UNIX系统编程手册(下册)
2016-09-18 08:31:02《linux/unix系统编程手册(上、下册)》是介绍linux与unix编程接口的权威著作。linux编程资深专家michael kerrisk在书中详细描述了linux/unix系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。... -
LINUX.UNIX系统编程手册(下册).pdf
2016-09-20 20:43:47LINUX.UNIX系统编程手册(下册).pdf -
Linux UNIX系统编程手册(上册).pdf
2016-09-20 20:42:25Linux UNIX系统编程手册(上册).pdf -
[Linux系统编程/网络编程] 笔记目录
2021-04-19 17:10:51Linux系统编程 [Linux系统编程]文件IO(一) [Linux系统编程]进程(二) [Linux系统编程]信号(三) [Linux系统编程]守护进程/线程(四) [Linux系统编程]线程同步(五) [Linux系统编程]进程通信-消息... -
LinuxUNIX系统编程手册
2014-04-27 16:32:07LinuxUNIX系统编程手册非常适合新手学习的好资料 -
【Linux系统编程】Linux系统调用
2019-09-22 20:52:34用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 ...00. 目录
01. 系统调用概述
系统调用顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。
从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道 Linux 的运行空间分为内核空间与用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数 printf 就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。
但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。
02. 系统调用实现
系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU 可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢?
答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,又是编程人员开发出的一种异常(该异常为正常的异常)。操作系统一般是通过软件中断从用户态切换到内核态。
中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。更多详细说明请看《系统调用的实现原理》。
03. 系统调用和库函数的区别
Linux 下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。
库函数由两类函数组成:
1) 不需要调用系统调用
不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy、bzero 等字符串操作函数。
2)需要调用系统调用
需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如 printf、fread等。
系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。
库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。缓冲区详情请看《浅谈标准I/O缓冲区》。
这个过程类似于快递员给某个区域(内核空间)送快递一样,快递员有两种方式送:
-
来一件快递就马上送到目的地,来一件送一件,这样导致来回走比较频繁(系统调用)
-
等快递攒着差不多后(缓冲区),才一次性送到目的地(库函数调用)
04. 附录
-
-
Linux系统编程:入门篇视频教程
2018-10-16 17:39:03Linux系统编程视频课程为《Linux系统编程》入门篇,主要针对零基础的Linux开发学员科普Linux系统编程的概念以及需要掌握的各种技能,掌握Linux命令编写、Linux学习路线并熟悉嵌入式设备编程的方法。为后续的Linux... -
《LINUX/UNIX系统编程手册》((德)Michael Kerrisk )随书代码完整版
2016-04-21 09:36:10《LINUX/UNIX系统编程手册》((德)Michael Kerrisk ),上下册,经典的LINUX/UNIX下C语言编程教材,这是这本书所用到的所有代码,包涵所有头文件,亲测在LINUX下完美运行 -
Linux系统编程手册 学习笔记(一)
2018-08-28 00:02:24第三章 系统编程概念 1、系统调用的概念: 用户通过系统调用来进入到linux内核中,可以利用应用程序编程接口(API)的形式来访问系统提供的服务。其中包括创建新的进程、执行I/O、为进程间通信创建管道等。 2...第三章 系统编程概念
1、系统调用的概念:
用户通过系统调用来进入到linux内核中,可以利用应用程序编程接口(API)的形式来访问系统提供的服务。其中包括创建新的进程、执行I/O、为进程间通信创建管道等。
2、用户态进行系统调用情况:
用户通过调用glibc库中的外壳函数来发起系统调用。
外壳函数会将系统调用所需参数传入到特定的寄存器內;系统调用进入内核的方式都是一样的。
内核为了区分要调用哪一个系统操作,所以使得外壳函数将需要使用的系统调用编号也要存放到相应的cpu寄存器中(%eax)。
系统调用完毕会返回给外壳函数一个值来表明调用结果,然后外壳函数利用返回值来设置全局变量errno。然后,外壳函数会返回调用程序,并返回一个整型值来表明系统调用是否成功。
在linux上,系统调用的惯例是调用成功返回非负值。发生错误时,将相对应的errno常量取反再返回。外壳函数会对其再次取反,并将结果拷贝到errno中,同时以-1作为外壳函数的返回值返回,向调用程序表明有错误发生。
系统调用的开销小,但系统在用户态与核心态之间的切换耗时较长,不如直接使用库函数。
3、库函数:
库函数有的可以不使用任何系统调用,而有的则建立在系统调用之上。例如,库函数fopen()就利用系统调用open()来执行打开文件的实际操作。标准c语言函数库:glibc。在ubuntu上可以使用 ldd –version 来查看自己的glibc版本号。
4、处理错误:
几乎每个系统调用和库函数都会返回某类状态值,用来表明调用是否成功。要了解调用是否成功,必须要对状态值进行检查。如果调用失败,必须作出响应,至少要将错误信息显示出来,警示有错误发生。不然少敲几行代码的代价就是浪费大量的程序调试时间。
每个系统调用的手册页记录有调用可能的返回值,并指出了哪些值表示错误。通常,返回值为-1表示出错。因此,需要对系统调用的返回值进行检查。:fd=open(pathname,flags,mode); /*系统调用去打开一个文件*/ if(fd==-1){ /*判断系统调用的返回值,返回-1则发现系统调用出错 如果发现系统调用失败,则进行解决错误方案*/ } ... if(close(fd)==-1) { /*判断系统调用的返回值,返回-1则发现系统调用出错 如果发现系统调用失败,则进行解决错误方案*/ }
系统调用失败时,会将全局整型变量errno设置为一个正值,用来表示具体的错误。
程序应包含相应的头文件,该文件提供了对errno的声明,以及一组针对各种错误编号而定义的常量。所有这些错误的符号名都以字母E开头。
利用errno诊断系统调用错误的一个简单示例:#include <errno.h> //要调用errno,就必须要包含该头文件 cnt=read(fd,buf,numbytes); if(cnt==-1){ if(errno=EINTR) fprint(stderr,"read was interrupted by a signal\n"); }else{ /*一些其他的错误发生了*/ }
如果调用系统调用和库函数成功,errno绝对不会被重置为0。
在进行错误检查是,必须坚持首先检查函数的返回值是否表明调用出错,然后再检查errno确定错误原因。而一些特殊的系统调用(会在调用成功时,仍然返回-1),在判断这类系统调用是否发生错误时,应在调用前将errno置为0,并在调用后对其进行检查。
系统调用失败后,常见的做法之一就是根据errno值打印错误消息。提供的库函数perror()和strerror()就是为了打印错误消息。
函数perror()会打印出其msg参数所指向的字符串,紧跟一条与当前errno值相对应的消息。#include <stdio.h> void perror(const char * msg);
函数strerror()会针对其errnum参数中所给定的错误号,返回响应的错误字符串。
#include<string.h> char *strerror(int errnum); returns pointer to error string corresponding to errnum
两个函数的调用示例:
#include<stdio.h> #include<string.h> #include<errno.h> int main () { FILE *fp; /* 首先重命名文件 */ rename("file.txt", "newfile.txt"); /* 现在让我们尝试打开相同的文件 */ fp = fopen("file.txt", "r"); if( fp == NULL ) { /*用来输出错误的编号*/ printf("errno is: %d\n",errno); /*输出错误编号相对应的信息*/ printf("errno is: %s\n",strerror(errno)); strerror(errno); /*输出字符串,并返回相应错误的信息*/ perror("Error: "); return(-1); } fclose(fp); return(0); }
以上代码调用显示的结果为
运行结果1:
运行结果2:
截取其他示例:
由于strerror()所返回的字符串可以是静态分配的,这意味着后续对strerror()的调用可能会覆盖该字符串。
如果无法识别errnum所含的错误编号,则strerror()会返回“Unkonwn error nnn”形式的字符串。在这种情况下,strerror()也有可能返回NULL。
处理来自库函数的错误时:
不同的库函数在调用发生错误时,返回的数据类型和值也可能不一样。从处理方式来看,可分为一下几类:
1)某些库函数返回错误信息的方式与系统哦你调用完全相同,——发生错误返回-1,并伴以errno来表示具体的错误。例如remove()函数。对于此类的函数的处理方式与系统调用完全相同。
2)某些库函数在出错时会返回-1之外的其他值,但仍会设置errno来表明具体的出错情况。例如,fopen()在出错时会返回一个NULL指针,但还会根据出错的具体底层系统调用来设置errno。那么就还可以使用perror()和strerror()来诊断此类错误。
3)有些函数发生错误时不会使用errno。那么确定错误存在与否和它的起因的方法就要随函数来具体设定。 -
linux怎么编程
2021-02-24 15:52:41最近开始学习linux编程,对于linux的命令,却还不特别熟悉,在此记录一下,学习linux的一些命令 首先ctrl+alt+t打开终端,然后使用vim进行编程 vim hello.c 在hello.c中 按下 i 或者 insert 输入以下内容 输入完成后... -
使用visual studio 2019进行Linux系统编程
2021-05-18 15:28:40使用visual studio 2019进行Linux系统编程首先打开: 修改、安装Linux工具: 新建Linux工程、远程连接Linux服务器、配置编译器: 项目属性配置: Ubuntu系统安装工具:目标 Linux 系统必须安装 openssh-server、g++... -
《Linux/Unix系统编程手册》源代码下载编译
2019-10-19 19:30:12安装双系统或者Linux单系统。 租一个Linux云服务器。 虚拟机。 下载源代码 进入代码下载界面http://man7.org/tlpi/code/index.html,选择Distribution version或者Book version,直接下载。 或者我们这里使用wget... -
Linux系统编程哈工大中文版
2010-06-04 14:39:42Linux系统编程 Linux系统编程 Linux系统编程 Linux系统编程 Linux系统编程 Linux系统编程 Linux系统编程 Linux系统编程 -
linux系统编程 中文版
2011-09-19 18:44:23linux系统编程 中文版linux系统编程 中文版linux系统编程 中文版linux系统编程 中文版linux系统编程 中文版linux系统编程 中文版linux系统编程 中文版 -
Linux系统编程中文版.pdf
2014-05-05 07:39:55Linux系统编程中文版.pdf -
Linux系统编程——延时函数
2021-01-26 16:43:56Linux 系统编程下用到的延时函数在头文件 #include <unistd.h> 包括 sleep,usleep; Linux 内核中用到的延时函数在头文件 #include <linux/delay.h> 包括 ndelay,udelay,mdelay。 2. sleep 函数... -
Linux/UNIX系统编程手册(上册)
2016-05-17 14:51:43《linux/unix系统编程手册(上、下册)》在汇聚大批 linux专有特性(epoll、inotify、/proc)的同时,还特意强化了对unix标准(posix、sus)的论述,彻底达到了“鱼与熊掌,二者得兼”的效果,这也堪称本书的最大亮点。... -
Linux操作系统Shell编程
2011-05-07 19:11:43经典Linux和unix的Shell编程,按照模板练习即可快速提高。 -
资深程序员带你攻克 Linux 系统编程
2019-01-17 10:45:43作者简介:宇文拓,近十年 Linux C/C++ 开发经验,现就职于某创业公司,负责服务器架构与系统设计。曾就职于某通信业知名美企,负责核心网和防火墙产品研发。在 GitHub 上发布了开源项目 AndroidMemTracer。 如果将... -
linux系统编程——文件编程
2020-06-29 14:46:08标题linux系统编程——文件编程 ps:本文为本人学习记录所用 一、如何创建、修改一个文件 手动修改文件:打开/创建文件→编辑文件→保存文件→关闭文件 linux中使用编程来操作文件,但真正了解如何文件编程是很复杂...