Linux和Windows编程的不同——一些个人经验

 

realtang

05-11-07, 17:02
大前提,不牵涉到开发驱动。
单就控制台下面的应用开发(单进程)来说,几乎是一样的。不同的是,win32下面的控制台应用较少支持信号这种进程通信方式,好像只支持POSIX标准当中的3个吧,SIGINT,SIGTERM什么的。
Win32的控制台也不能支持fork创建新进程。也就是win32的多进程的实现又和linux有大不同。会用到CreateProcess函数。
如果就开发标准windows应用来说。差别是巨大的。Linux不像Windows有内嵌的消息队列机制,Linux的消息队列要通过IPC才能实现。并且用户接口图形库上,Linux的API特别的多大大超过windows的为大家耳熟能详的那种DC(设备上下文)方式。有基于X11的,也有基于Framebuffer的,更上一层的就是QT,GTK,SDL,DFB等。
如果要开发多线程应用,差别就更加大了。pthread那一套东西,在win32竟然派不上用场。
对于网络应用开发来讲,主要是Socket的编程。虽然BSD的那套API在windows上也能用。但从winsock 2.0开始,微软大大扩展了winsock的API。复杂度远远超过了Linux。
另外还有一个重要的一块,就是COM的开发。现代的Windows较多的采用了组件对象模型来进行模块开发,甚至一些驱动也是用COM开发的。但是COM在Linux的世界里只是很小的支流。不能成为气候。
另外从游戏开发的领域来看,Linux也不支持D3D的API,主要也因为D3D是基于COM的吧。所以Linux的游戏开发就只能以OpenGL单腿行走。而不像windows两种3D图像API都可以使用。
大概这么一说,大家可能会有这样的认识:其实在Linux下开发的复杂度远远小于Windows的。我也是这样的认为。

realtang
05-11-07, 17:04
我个人主要是从事跨平台的网络视频应用开发。所知甚少,所以上文不当之处,还要请大家即时指出。
欢迎大家跟贴,一起来讨论。

x11
05-11-07, 17:33
我也认为linux下开发比windows简单

小锁
05-11-07, 17:57
我也同意!

wide288
05-11-08, 08:55
gnu/linux 下开发游戏 sdl 也是用opengl 开发的吗?也只能算是 OpenGL 的一支吗?
开发图形接口中:“基于X11的,也有基于Framebuffer的,更上一层的就是QT,KDE,SDL,DFB”
从开发进度和性能上看那个更优呢。
总分五分的话。
Framebuffer 2 5
x11 2 4
QT 4 3
KDE 5 2
SDL 3 4
DFB
GNOme 进度优= 5 ;性能差=2
gtk+ 4 3
不知道这样对不对。只是我现在的了解程度就这样了。
3d 的开发好像只有 opengl 了。

realtang 兄,现在 gnu/linux 的网络视频应用怎么样了?介绍一下现状如何?

realtang
05-11-08, 10:10
gnu/linux 下开发游戏 sdl 也是用opengl 开发的吗?也只能算是 OpenGL 的一支吗?


realtang 兄,现在 gnu/linux 的网络视频应用怎么样了?介绍一下现状如何?
第一个:
SDL的游戏开发中,如果是2D的话。在Win32的平台下是用DirectDraw实现的,在Linux的X11环境中,用哪种API我就不是很熟悉。但是在基于Framebuffer的实现中,是直接采用内核提供的framebuffer的API实现的,SDL也提供基于DirectFB的2D实现,理论上说可以利用到一些硬件加速功能。
SDL对3D的支持,仅仅限于使用X11(据我所知,利用DFB也是可行的,可是我没有实践过,不好说),利用mesa提供的一套API就可以实现OpenGL方式的3D游戏。
第二个:
我目前主要做MPEG1/2/4的网络视频点播系统,服务器和客户端。服务器端都是Linux平台,客户端则有普通桌面PC的(安装windows操作系统),机顶盒(Linux的,WinCE),一般机顶盒都通过浏览器实现点播。开发也比较容易,机顶盒生产厂商都提供了基于Javascript封装好的对象,new一下,然后调用方法就可以。
PC平台上开发比较稍微麻烦一些,win32平台的话就用DirectDraw加Overlay加以呈现,如果是linux的PC平台,就用SDL或者DirectFB加以呈现。

xiao_xiao
05-11-11, 13:58
在Linux的X11环境中,用的是XV扩展

pank7.yardbird
05-11-11, 17:31
fork函数是POSIX标准里的吧,那windows也应该实现了。

有一个问题就是winsock2扩展了BSD的sock,那具体有什么不同呢?是功能更强大了吗?或者是更方便了?

realtang
05-11-11, 17:42
你试试VC++就知道了。windows声称支持POSIX标准,其实是骗人的。

说真的,WINSOCK2真的非常强大。很佩服Microsoft的工程师。

pank7.yardbird
05-11-11, 17:48
骗人的?我没有用过。
fork是unistd.h里面的,这个都没有实现吗?

zhllg
05-11-11, 21:24
除非装个cygwin之类的东西

wolf0403
05-11-12, 14:26
Win32 的 POSIX 实现是在它的 Interix (SFU) 中实现的,普通的 Windows 默认并不会安装这个组件。SFU 完全模拟了一个 Unix 环境,甚至包括了 FIFO 等 Win32 本身不提供的功能。

SDL 的 2D 部分有多种不同的后端,包括 fbcon, x11 等。3D 部分直接支持 OpenGL。

总的来说,在 API 方面,Win32 的编程模型是经过精心设计与选择的,也许少了一些『自由』,但是降低了开发的学习曲线和选择的时间,未必不是一件好事。Linux 下各种不同的 API 太过繁多,而且没有一种主导意见,因此用户程序的互不兼容与前后更新造成的 dependency hell 实在不可避免。

Westwind
05-11-13, 11:48
你试试VC++就知道了。windows声称支持POSIX标准,其实是骗人的。

说真的,WINSOCK2真的非常强大。很佩服Microsoft的工程师。

socket不过是系统调用的接口,也就是<>第15章所提及的插口层,不过是一个系统调用的接口,也是kernel tcpip代码的一部分,是给开发人员用的api接口,而不是网络实现的一部分,所以首先需要说明的是,socket api和性能无关。
我在windows下一直在开发网络应用,无论如何,windows的网络处理能力远远不及freeBSD,无论他的winsock api说的如何神乎其神。

windows编程确实比unix-like复杂,不过无论多复杂,那些大多都是人为定义的东西,也许某一天microsoft会改变所有的东西,他们不是真正的计算机知识(经典计算机科学(unix))。
来源: http://www.linuxsir.org/bbs/archive/index.php/t-229138.html

你可能感兴趣的:(default)