Windows 和 Linux 应用程序从上到下调用层次比较
刚毕业的时候,做了将近一年的Window下的程序开发,主要用MFC,那是也不明白程序在操作系统角度从上到下的整个调用层次。遇到调用库函数,不明白,就查MSDN,每个月1500行代码左右,那时以为这就是软件开发了。后来跳槽的另外一家公司,工作也是Windows下的程序开发,这里可以用到多线程、COM组件,还能用到设计模式,那时高兴的不得了。刚开始用到多线程,就买了一本书《WIN32多线程程序设计》,边学边用。
创建线程有好几种方法,比如: CreatThread 和 _beginthread()等,记得当时不明白这几种方法有何区别,就随便拿一个用。心中有疑问:怎么创建一个线程这么多函数?WINAPI、CRT、MFC 到底有何关联?最近读《程序员的自我修养》一书,给了我明确的答复。参考下图:
从上图可以看到,CRT和MFC函数最终都是调用WINAPI来实现的。即CRT和MFC库函数都是对WIN API的封装。终于明白了创建线程函数分属不同的层次/类库,如下:
1. WINAPI: CreateThread();
2. CRT: _beginthread(); 和 _beginthreadex();
3. MFC AfxBeginThread();
Linux下应用程序调用层次如下图:
上图只是列出了CRT,当然也存在其它很多类库,比如Linux下QT库,也是对系统调用的封装。
从Windows和linux程序调用层次图,我们可以看到有如下区别:
Linux下可以直接进行程序调用,而Windows下不能直接进行系统调用。即Windows下的系统调用接口微软并没有开放给developer, 而是在系统调用上面添加了一层WINAPI。至于微软为什么不开放系统调用,而添加一层WINAPI,诸位可以参考《程序员的自我修养》第12章的12.3.2。Windows API是以DLL导出函数的形式暴露给developer的,核心DLL有kernel32.dll、user32.dll和gdi32.dll. 我们可以用dumpbin /EXPORTS *.dll命令来查看每个dll的导出函数。
根据以上2个图,来简单谈一下跨平台编程。大家知道windows下的应用程序.exe放到Linux下是不能运行的,反之,Linux下同样不能运行Windows下的程序,就相当于用PDF Reader 打不开 Word文档一样,大家知道Windows下的可执行文件是PE文件格式,Linux可执行文件下是ELF文件格式。
我们程序员写的代码,用Windows下的编译器连接器(cl,即 VC++编译链接器)编译连接后,生成的目标文件是PE文件格式,同样的代码在Linux下用编译器gcc编译,链接器ld链接,生成的目标文件是ELF文件格式。同样的代码在不同的平台下编译通过的前提是代码中的函数符号(Symbol)能够被正确识别,这里我们不得不提及CRT,即C Runtime, Windows下是MSVCRT, Linux下是glibc (GNU C Library). C 语言运行库至少包含如下功能:
1. 程序的启动和退出;
2. 标准函数, 既是C语言标准库;
3. I/0
4. 堆heap 的 封装和实现;
5. 调试
我们主要关注第2点:标准函数,即只要代码中我们调用函数都是C语言标准库函数,这些函数代码在Windows和Linux下是都能识别的,因为glibc和MSVCRT都在各自的平台上实现了这些函数,简单的讲就是: 提供给developer的函数接口遵从C标准库,下层实现调用各自系统的系统调用。如果你调用MFC库中的函数,这些函数Symbol在linux下是无法识别的。所以我们在写跨平台C代码时(我们这里不讨论JAVA), 一定要调用标准C库函数,这样完成的代码就可以在Windows和Linux下用各自的编译器链接器编译链接(备注:包含的头文件不同,因为MSVCRT和glibc导出c库函数头文件不同),生成的目标文件就可以在各自的系统上运行。
相关文章:

Java项目:药品管理系统(java+swing+Gui+mysql)
源码获取:博客首页 "资源" 里下载! 功能介绍:用户管理、药品库存管理、进销管理、营销管理、药品购入、药品售出、药市信息 系统主页: SuppressWarnings("serial") public class SystemMainView extends JFr…

WEBSHELL跳板REDUH使用说明
原文链接: http://www.fendou.info/network/webshell-proxy-reduh.html reDuh是可以把内网服务器的端口通过http或https隧道转发到本机,形成一个TCP连通回路,用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部端口的工具。 reDuh和LCX类似&…

站立会议(三)
一、会议时间:2014年4月13日 二、会议目的:统计项目进度以及每个人的进度、计划以及问题 三、会议内容: 党云龙: 今天内容 查阅资料,上网搜索,完成API调用; 遇到问题 还是在实现的时候无法阻止…

python celery
celery 一般用于做异步 和定时任务 不过听网上说 celery 坑还是蛮多的,特别定时任务,我们一般用来做定时任务,还有数据导入导出。celery 不支持 redis cluster 集群模式uWSGI 自带了一个简单的 Spooler 可以处理大部分异步任务和周期运行的任…

c语言实现memcpy
今天到I 公司去面试,面试方式比较特殊,没有笔试,就是2 个面试官,一人一句轮番发问,涉及面很广,涉及到操作系统(MMU 、page out 、process/thread 、semaphore 、interrupt), OOP( 多态、design pattern) 、…

Java项目:图书管理系统(java+swing+Gui+Mysql)
源码获取:博客首页 "资源" 里下载! 功能介绍:借阅列表、图书类别管理、图书馆里、用户管理、借阅管理、关于我们 登录服务类: WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet …

十五天精通WCF——第三天 client如何知道server提供的功能清单
通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一个…

MySQL Cluster 日常维护
在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解。而且相信大家都掌握了基本用法。现在我们来看看Cluster的日常维护。熟悉日常维护,将有助于工作中更好的管理和使用Cluster。 一. 数据备份 相信大家都熟悉mysql的日常备份工具,比…

20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告
20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告 一、个人贡献 参与课设题目讨论及完成全过程; 资料收集; 负责环境搭建,代码运行下载; 撰写小组结题报告。 二、设计中遇到的问题及解决方法 1 实验六以太网服…

extern数组与extern指针
数组名代表了存放该数组的那块内存,它是这块内存的首地址。这就说明了数组名 是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名 跟枚举常量一样,都属于符号常量。数组名 这个符号…

Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
源码获取:博客首页 "资源" 里下载! 功能介绍: 登录、注册、用户/管理员(角色)、用户信息管理、科系信息管理、查看所有科系、新增科系信息、删除指定科系、修改科系信息、病房信息管理、病人信息管理、医生类型管理、病人手术管理…

Mongodb地理空间索引
1、索引: 建立索引既耗时也费力,还需要消耗很多资源。使用{"bakckground":true}选项可以使这个过程在后台完成,同时正常处理请求。如果不包括background 这个选项,数据库会阻塞建立索引期间的所有请求。阻塞的做法会让索…

Juniper的路由器、防火墙、交换机如何恢复出厂配置
Juniper的路由器、防火墙、交换机如何恢复出厂配置有些时候,在正常的业务使用中,逐条删除配置的内容很繁琐,我们可以使用恢复出厂配置,清空设备中的配置;还有的时候,由于设备配置异常,可以使用恢…

【转载】标准输入输出、错误输出、重定向标准输出
【转载】标准输入输出、错误输出、重定向标准输出 原文:标准输入输出、错误输出、重定向标准输出 再来看看 >& 操作符: 重定向操作符描述 > 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或…

(Interrupt Latency) 中断延迟
中断延迟 (Interrupt Latency) 中断延迟 是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 也就是: 计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。 不严格地,也可以表述为:…

Java项目:干活管理系统(java+SSM+Jsp+Mysql)
源码获取:博客首页 "资源" 里下载! 前台用户和后台管理员两种角色: 前台用户功能有:发布兼职、发布帖子、查看公告、个人中心、投诉等。 后台管理员功能有:用户管理、兼职管理、帖子管理、聊天管理、广告管…

20135234mqy 实验四
北京电子科技学院(BESTI) 实 验 报 告 课程:java程序设计 班级:1352 姓名:mqy 学号:20135234 成绩: 指导教师:娄嘉鹏 实验日期:2015.6…

我的第一张地图报表
一直以来对于地图都很陌生,感觉好强大,可以根据地理位置去分析数据,下面我简单的做了一张地图展示数据的报表。 接下来就简单的说一下设计过程和应该注意的地方 效果:(鼠标放在省份区域上,显示该省的数据&a…

SpringBoot第十篇:thymeleaf详解
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 SpringBoot 对 Web 的支持,官方推荐的是模板引擎 thymelaf。本章中&…

嵌入式系统开发过程中遇到的——volatile
嵌入式 系统开发过程中遇到的—— volatile 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的 。如果系统结构支持独立的 I/O 地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制ÿ…

薏米红豆粥的功效和实践演示
熬薏米红豆粥有很多技巧和讲究。薏米很硬,红豆也很硬,假设已经煮在锅里,大概熬一个多小时不坏,这是一种浪费火灾或电力,它甚至可以把水烧开,原因症结。我建议的方法有两种:第一种方法是在锅里加…

Java项目:财务预算管理系统(java+SSM+Jsp+Mysql+Layui+Maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能包括:实现公司对项目的管理。 二、项目运行 环境配置: Jdk1.8 Tomcat8.5 mysql Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) …

POJ 3080 多个串最长公共子序列
求多个串最长公共子序列,字典序最小输出。枚举剪枝kmp.比较简单,我用find直接查找16ms #include<iostream> #include<string> #include<algorithm> using namespace std; string s[61]; int main() {int ta;cin>>ta;int n;while…

HDU 2561 第二小整数
2019-05-27 18:07:06 加油,坚持!!! 水题 #include <bits/stdc.h> using namespace std; int a[100]; int main() {int t;scanf("%d", &t);while(t--){int n;scanf("%d", &n);for (int i 0; i …

Java项目:在线高中考试系统(java+SSM+Jsp+Mysql+Maven)
源码获取:博客首页 "资源" 里下载! 项目分为前台和后台,前台主要为学生角色、后台主要为管理员角色。 管理员添加试题和发布试卷,学生负责在线考试、在线查看成绩和错题记录列表等。 管理员功能有:年级管理…

asp.net mvc 学习
Routing讲解: http://www.cnblogs.com/wangiqngpei557/p/3379095.html Filter讲解: http://www.cnblogs.com/ymnets/p/3452407.html ASP.NET MVC 支持以下类型的操作筛选器: 授权筛选器。 这些筛选器用于实现 IAuthorizationFilter 和做出关于…

Linux数据库性能优化--文件系统相关优化
实际也中也用到下文中所说的内存文件系统1、ramfs 记得是32位文件系统安装oracle 为oracle分配SGA突破1.7G大小限制2、mmap 的文件可以放在tmpfs挂载的文件系统中http://www.ibm.com/developerworks/cn/linux/management/tune/index.html1. 引言实践证明Lin…
jQuery Mobile的学习时间bottonbutton的事件学习
版权声明:本文为博主原创文章。未经博主同意不得转载。https://blog.csdn.net/xmt1139057136/article/details/27700521 程序猿都非常懒,你懂的! 生命的绝唱来机仅仅争朝夕,如诗的年华更需惜时如金。不要让今天的懈怠成为一生的痛…

C++中 public,protected, private 访问标号小结
第一:private, public, protected 访问标号的访问范围。 private: 只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 protected: 可以被1.该类中的函数、2.子类的函数、以及3.其友元函数…

Java项目:学生管理系统(java+Springboot+Maven+mybatis+Vue+Mysql)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 学生管理,教师管理,课程管理,成绩管理,系统管理等等。 二、项目运行 环境配置: Jdk1.8 Tomcat8.5 M…