技术分享 -- 159




问题在C++ programming language一书的第九章中描述了C++的单一定义规则,ODR,根据这一规则,“一个inline函数必须在需要用他的每个编译单位里通过完全一样的定义来定义”并且举了例子:file1.c:inline int f(int i) { return i; } file2.c:inline int f(int i) {return i+1;} 书中说这个例子是非法的,因为在两个编译单位中的定义不完全相同那么,下面是我写的一个代码,也是我的问题:我的程序分为main.cc、func.cc和function.h三个文件,main.cc和func.cc中定义了两个如上面反例所写的同名inline函数,他们的函数体并不相同,function.h中是这个inline函数的声明:/* * file: main.cc * author: 龙泉居士 * date: 2012-10-17 04:37 */ #include <iostream> #include "function.h" using namespace std; int main () { f(3); return 0; } inline void f (int a) { cout <<
#读书笔记    #技术帖    #c++    #cpp   
问题fork调用只会复制调用线程,既然fork复制父进程地址空间中的全部内容,为什么只复制调用线程?难道线程不在进程的地址空间中吗? 解答:进程的地址空间主要是指内存的部分,而是否只复制调用线程,这是操作系统决定的特性 
#技术帖    #unix    #技术分享    #线程   
问题一发现在CGI中父进程和子进程不能同时读写,为什么会这样,在父进程完全不读写的情况下子进程读写没有问题 问题二这个问题因为另一个问题的启发,冥冥之中觉得应该可以解决,只是现在学识的不足,没有什么想法,另一个问题就是:#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main () { printf ("please input the loop time:\n"); int t, i; scanf ("%d", &t); FILE *f; f = fopen("forkfile", "a"); for (i=0; i!=t; ++i) { fork(); fprintf (f, "-"); printf ("-"); } fclose(f); return 0; }  为了及时地释放资源,于是改了一下,改成了下面这样:#include <stdio.h> #incl
#技术帖    #c语言    #进程    #fork   
引言今天一个同学问我结构体怎么用,他说之前可以运行的代码突然不能运行了,说编译器报的错是“undeclared”,但是明明在h文件中定义了这个结构体大体上代码是这样的://main.h struct Node { int value; Node *next; }; //main.c Node *n = (Node *)malloc(sizeof(Node)); 看上去并没有问题,可是编译器确实报了undeclared错,这是为什么呢?下面就三个问题说一下 结构体C语言中,结构体是一个非常常用的基本的语言特性,其优势在于,将数据进行封装,但是C语言中的结构体和C++中的struct是有着本质区别的,C++中的struct并不是传统意义上的结构体,而是默认为public的类,C语言中的struct中是绝对不允许有函数的,但是在C++中的struct是可以的,这是因为在C++中,struct并不是指结构体,只是默认为public的class,因此在显式声明类访问权限的例子中,struct和class是完全没有任何区别的,这也就是为什么在.cc的工程中可以使用的struct的定义和使用方法在.c的工程中却不行,因为C语言中的struct和C++中的struct根本就是两种完全不同的东西,只是有的时候可以做相同的事而已,两者本质上
#技术帖    #c语言    #结构体    #技术分享   
概述C99为C语言添加了很多新的特性,尤其在结构体的使用中,有了新的十分方便的功能 复合常量传统的C语言没有办法生成匿名结构值,必须使用临时结构变量活一个小结构生成函数:typedef struct Point { int x; int y; } Point; void printpoint (Point p); int main () { Point pt; pt.x=3; pt.y=5; printpoint (pt); return 0; } 在C99中,这一情况得以改善,因为C99中引入了“复合常量”的概念复合常量的一种形式就可以允许结构常量,例如,我们可以如下面这样调用:typedef struct Point { int x; int y; } Point; void printpoint (Point p); int main () { printpoint ((Point){3, 5}); return 0; } 或者:typedef struct Point { int x; int y; } Point; void printpoint (Point p); int main () { printpoint (
#技术帖    #c语言    #struct    #结构体   
概述最近一直在看《现代操作系统》这本书,此前对操作系统只是有一个基本的认识,在笔试面试中吃过不少亏,所以觉得这方面的欠缺的知识亟待去补充,于是开始了这本书的研读现在刚刚读完线程这个部分,对线程、进程有了一些自己的认识,也不知道理解是不是准确 进程简单的说进程就是一个程序第一次执行,程序是储存在磁盘上的文本部分,载入内存开始执行后就是一个进程,进程是独占CPU等资源的,CPU可以在短时间内不停地切换进程来实现多进程并行执行的假象 线程由于人们日益增长的需要,只有进程的并行显得效率很低,而且各进程之间不能共享资源有时是无法完成某些工作的,因此,诞生了切换更加快速的“轻量级进程” -- 线程,一个进程可以有多个线程,和多进程并行执行的原理一样,通过不断切换实现多线程并行执行的假象,但是这个切换时间只有纳秒级,要比进程的并行执行效率高得多 多线程的好处传统的进程只有一个调用线程,指令顺序执行,这样一个进程在某一时刻只能选择做一件事,比如对于文件下载程序,如果没有多线程,那么下载进度条将无法与下载进度保持真正的一致,因为如果进程去更新进度条,那么就一定会阻塞下载,但是实现多线程后,每件事都可以让不同的线程来完成,这样实现了进程内的并行处理,如果每件事占用CPU运算的10%,多线程让CPU使用率提升到了30%当然,多线程也有很多诸如维护等方面的
#技术帖    #操作系统    #os    #技术分享   

200x200


进程是一个程序的一次执行,而一个进程中至少要有一个线程线程的划分尺度要小于进程,使得多线程程序的并发性很高,所以线程也被称为“轻量级进程”每个进程可以不同的用户创建,具有不能共享的资源,进而构成竞争关

#技术帖    #操作系统    #os    #技术分享   
UNIX提供给应用程序员以100多个系统调用,用以在用户态下完成进程管理、文件管理等需要提升至内核态的操作,而windows下,应用程序员不能直接使用系统调用,而需要借用操作系统提供的数千个WIN32 API来完成,每个API函数可以调用一个或多个系统调用也可以不调用任何系统调用,仅仅在用户态下完成操作,不同版本的相同API所调用的系统调用以及其调用方式也可能不同windows的数千个win32 API有大量用于管理视窗、几何图形、文本、字型、进度条等的GUI的相关功能,而UNIX中,GUI并不是系统的组成部分,所以UNIX提供的系统调用仅仅负责最基本的操作基于win32 API的编程一般是事件驱动的,即在主程序中等待某件事件的发生,然后调用相关的处理方法处理该事件,包括键盘敲击、鼠标移动等,之后更新内部程序状态,而UNIX中每一个程序会包括做各种处理的代码以及从事完成特定服务的系统调用进程创建:UNIX中使用系统调用fork通过复制父进程地址空间开辟子进程,而在windows中,没有子进程的概念,windows中使用CreateProcess这个API来完成fork和execve的功能,创建新的进程,之后新的进程与创建者失去关系,平等的进行操作windows不支持编程实现文件的链接、文件系统的安装、安全属性或信号,当然,windows也同样有大量UN
#技术帖    #操作系统    #os    #unix   
今天写了一个程序:/* * file: main.cc * author: 龙泉居士 * date: 2012-10-05 10:15 */ #include <iostream> #include <sstream> #include <cstdarg> using namespace std; void error (const char * a ...) { char ch; va_list ap; va_start (ap, a); istringstream isstr(a); while (isstr.get(ch)) { if (ch == '%') { isstr.get(ch); switch (ch) { case 's': { char *p = va_arg(ap, char *); cerr << p; break;
#技术帖    #c语言    #技术分享    #va_arg   
执行 sudo vim /boot/grub/grub.cfg 打开 grub.cfg 文件 查找类似下面的配置信息:menuentry 'Ubuntu,Linux 2.6.32-22-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod ext2 set root='(hd0,7)' search --no-floppy --fs-uuid --set 7dde7e5c-249c-4128-b148-8ebae100cc7a linux /boot/vmlinuz-2.6.32-22-generic-pae root=UUID=7dde7e5c-249c-4128-b148-8ebae100cc7a ro quiet splash initrd /boot/initrd.img-2.6.32-22-generic-pae}  进行两处修改:在 menuentry 中写入标识,括在括号中,至于标识是什么,完全随意,如“text mode”把 quiet splash 改成 quiet text&n
#技术帖    #ubuntu    #字符界面    #图形界面   



京ICP备15018585号