1)试着装好了Carbide c++以及S60 3rd SDK后,却发现不能在C盘以外的地方建工程(在默认的C:\Symbian\Carbide\workspace之外建工程是可以的),真没想到Nokia出的工具还有这样不友好的限制。
PS:它的说明说工程要和SDK放在同一个盘中,结果我把SDK装在E盘,结果还是在C盘建工程可以,在E盘建不行,而且多次安装之后,我的系统崩溃了,郁闷,这个系统用了2年,都没有重装…
2)Symbian S60 2nd 和 3rd 的区别
http://www.opda.com.cn/viewthread.php?tid=182217&page=1#pid3004888
3)Carbide c++的一个小BUG
如果在开始利用向导生成代码时,没有选择armv5或gcce,而只选择了模拟器的情况下,在代码生成之后,再添加armv5或gcce的话,是不能自动生成sis文件的,可以在Project->Properties->Carbide c++->Build Configurations->SIS Builder中添加。
本来以为CGI编程会比较复杂,没想到从原理的角度,似乎比之前的JSP还要简单一些。这次主要是用C来编写CGI,使用的web服务器是Apache 2.0.55。网上看到了几篇同类的文章,但大多过于简略,有的甚至颇有错误,所以自己就重新写一篇吧。
如果是默认安装的话,只要将
AddHandler cgi-script .cgi
改为
AddHandler cgi-script .cgi .exe
即可。其他的完全不用改,只要你将后面编好后的.exe放到默认的cgi-bin中就行了。如果你要将.exe放到其他路径下的话,ScriptAlias和Options ExecCGI会派上用场。(详细的用法,翻手册查吧!)别忘了修改了配置之后,要重启Apache。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
char buf[256];
char *req;
printf("Content-type: text/html\n\n");
printf("");
printf("hello world!");
strcpy(buf,"HTTP_ACCEPT");
req = getenv(buf);
printf("%s",req);
strcpy(buf,"HTTP_REFERER");
req = getenv(buf);
printf("%s",req);
strcpy(buf,"QUERY_STRING");
req = getenv(buf);
printf("%s",req);
printf("");
return 0;
}
网上的例子只有输出,没有输入,其实不算好例子。用VC之类的编译器编好后,放到cgi-bin中,在浏览器中输入以下地址http://localhost/cgi-bin/cgi.exe?abc就可以看到效果了。还有printf("Content-type: text/html\n\n");
是一定要有的,没有的会报HTTP 500的错误,有的例子中说printf("\n");
就行了,这是不对的,至少在默认配置下,这样做的结果是你可以下载该.exe,但不能把它当做CGI来执行。
从这个例子,以及Apache官方的例子(http://httpd.apache.org/docs/1.3/howto/cgi.html)
#!/usr/bin/perl
print "Content-type: text/html\r\n\r\n";
print "Hello, World.";
中可以看出,Apache的作用其实是重定义了这些CGI程序的标准输入输出,以及设置了一些系统变量。这才是它支持多种编程语言编写的CGI的真正原因,试想还有哪种语言不支持标准输入输出呢?
可以在:
http://www.boutell.com/cgic/
中获得CGIC的代码,这是一个C写的CGI开发库,本文的示例就是在这个库的代码的启示下写出来的。
Windows下Apache的各个目录都放在一起,因此使用起来比较方便,而Linux下Apache的各个目录分散在各个地方不是太好找,特记录一下,以作备忘。
conf在/etc/apache2下,但是Linux下的httpd.conf实际上是个空文件,它的内容被分散到该目录下的其他文件中。
cgi-bin在/usr/lib/cgi-bin下。
bin下的文件在/usr/sbin下可以找到。
modules在/usr/lib/apache2下。
参考:
https://mp.weixin.qq.com/s/9oi-zkuUtjv0P6GyBLmatg
简单说明CGI和动态请求是什么
https://mp.weixin.qq.com/s/vmIscEgDotR6ntiIdjGBLg
关于CGI和FastCGI的理解
fbdev - video driver for framebuffer device
KMS(Kernel Mode Setting)
DRM(Direct Rendering Manager)
GBM(Generic Buffer Management)
Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现。
DirectFB则是一个针对基于Linux嵌入式系统优化的图形库,几年前在2D类的用户界面上很流行。DirectFB2尝试保留了原始的DirectFB后端、同时添加了新功能,例如Vulkan和OpenGL ES等现有的3D API。
官网:
https://directfb2.github.io/
https://www.cnblogs.com/armlinux/archive/2010/08/30/2396932.html
全面的framebuffer详解
https://blog.csdn.net/fyh2003/article/details/49253713
Wayland与Weston简介
https://www.cnblogs.com/lenomirei/p/11379535.html
渲染显示相关概念
SurfaceFlinger
VSYNC
前置Buffer是当前显示在萤幕上的缓冲区,后置Buffer是尚未显示在萤幕上的缓冲区。
Single Buffering使用一个前置缓冲区,在着色的同时影像立即显示在萤幕上。因此当萤幕更新影像时会出现闪烁的现象。Single Buffering在目前的程序中已很少使用。
Double Buffering则使用两个缓冲区,一个前置Buffer,一个后置Buffer。前置缓存的像素在屏幕上显示的同时,显卡正在紧张地着色后置缓存中的像素。
Triple Buffering使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区,没有Vsync等待的时间。
Gralloc
OpenCore:Android系统中早期内置的多媒体框架(是Google收购的PacketVideo公司的),后续Android又增加了StageFright框架。
https://source.android.google.cn/devices/graphics
https://www.sohu.com/a/308763349_100093134
深入浅出Android BufferQueue
https://blog.csdn.net/jinzhuojun/article/details/39698317
Android中的GraphicBuffer同步机制-Fence
https://www.zhihu.com/question/590782271
游戏显示器中的GSYNC与FreeSync技术原理是什么?
read-write lock、RCU lock、spin lock
对于悲观锁,开发者认为数据发送时发生并发冲突的概率很大,所以每次进行读操作前都会上锁。
对于乐观锁,开发者认为数据发送时发生并发冲突的概率不大,所以读操作前不上锁。
到了写操作时才会进行判断,数据在此期间是否被其他线程修改。如果发生修改,那就返回写入失败;如果没有被修改,那就执行修改操作,返回修改成功。
乐观锁一般采用Compare And Swap(CAS)算法进行实现。
比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。
RCU(Read-Copy Update)机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。
RCU适用于需要频繁的读取数据,而相应修改数据并不多的情景,例如在文件系统中,经常需要查找定位目录,而对目录的修改相对来说并不多,这就是RCU发挥作用的最佳场景。
ABA问题是指在CAS操作时,其他线程将变量值A改为了B,但是又被改回了A,等到本线程使用期望值A与当前变量进行比较时,发现变量A没有变,于是CAS就将A值进行了交换操作,但是实际上该值已经被其他线程改变过。
相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。
读写锁可以有三种状态:
只有一个线程可以占有写模式的读写锁,但是可以有多个线程占有读模式的读写锁。
https://mp.weixin.qq.com/s/mTOzcdjaak-z6ypL9MR2Lw
小白科普:悲观锁和乐观锁
https://mp.weixin.qq.com/s/t-jZ9GoqW46rU3t9ahHqCQ
mysql悲观锁总结和实践
https://mp.weixin.qq.com/s/6MRi_UEcMybKn4YXi6qWng
操作系统中锁的实现原理
https://www.zhihu.com/question/332113890
互斥锁(mutex)的底层原理是什么?操作系统具体是怎么实现的??
https://mp.weixin.qq.com/s/yHSraIAYsjYWPaGXA3PijA
一张图读懂非公平锁与公平锁
https://mp.weixin.qq.com/s/qnZL4ENAbTvVMVcImVTtYw
深入浅出CAS
https://mp.weixin.qq.com/s/g6TK1QiZgqPBDCE7gDJ3dA
面试必问的CAS原理你会了吗?
https://mp.weixin.qq.com/s/T_z2_gsYfs6A-XjVTVV_uQ
说说无锁(Lock-Free)编程那些事(上)
https://mp.weixin.qq.com/s/h75n7sHnrmoLJ4DVAW5AUQ
说说无锁(Lock-Free)编程那些事(下)
https://blog.csdn.net/zqz_zqz/article/details/70233767
java中的锁–偏向锁、轻量级锁、自旋锁、重量级锁
https://mp.weixin.qq.com/s/muSUJuE1A45UTXpWTeFxOA
24张图带你彻底理解Java中的21种锁
https://mp.weixin.qq.com/s/gbCshU5eEn4Gefduk1zdCQ
浅谈Java并发下的乐观锁
https://mp.weixin.qq.com/s/czLqzt0cRwPZeQ4WDaKiJQ
无锁队列的实现
https://mp.weixin.qq.com/s/rpufplXGYFo3P3mdIyY6vA
24张图带你彻底理解Java中的21种锁
https://www.cnblogs.com/linhaostudy/p/8463529.html
Linux RCU机制详解
https://zhuanlan.zhihu.com/p/67520807
Linux内核中的RCU
https://mp.weixin.qq.com/s/azy-lYHTtqdq2OrGwkfsmQ
图解多线程+1的最快操作
https://blog.csdn.net/qq_47768542/article/details/109117044
CAS原理分析及ABA问题详解
您的打赏,是对我的鼓励