0.LinuxC编程,要首先考虑:硬件平台问题……
1?.区别通配符和正则表达式
2?.区别Shell:单引号、双引号、反引号
3?.Shell编程的语法……
4.char *str="Hello"和char str[]="Hello"的区别
5.深入理解:传值调用和传址调用的区别
6.函数指针:区别int *fun()和int (*fun)()
7.gcc
gcc的编译过程分为:预处理、编译、汇编、链接四个阶段
gcc -pedantic:严格要求符合ANSI标准
……
8.time命令用于测量指定程序的运行时间
9?.C/C++的类型溢出问题、各种类型的精度
10.gdb(不要害怕工作量大,要细心跟踪程度每一步运行、每一个变量):
gdb的backtrace和frame n命令
gdb的跟踪变量的值的操作,print、display
gdb的断点调试,break的多种用法
……
11?.函数、C代码的内存地址?
12?.make和Makefile来管理多代码文件工程项目
?Makefile的语法
13?.open的flags和mode的取值?
14.gets函数的缺陷和漏洞:缓存区越界,尽量少用gets和puts,推荐fgets和fputs,后者更安全
15.fclose:
fclose(fp);执行之后再重复执行,就会出错
对fopen失败的FILE *,进行fclose()是会发生段错误的
16?.可读、可写、可执行的真实含义
17?.哪些是Linux的系统调用?哪些是C的库函数
18.fork:
一个fork在父进程和它创建的子进程都有返回值,父进程返回子进程的pid,子进程返回0
子进程是父进程的一个拷贝,即子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存,也就是fork之后父子进程各有自己的数据段和堆栈段,而对于只读的代码段,通常使用共享内存的方式访问
fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行到最后
fork之后,父子进程的执行顺序由内核来调度,所以是不确定的
19.vfork:
父进程返回子进程的pid,子进程返回0
区别于fork:
vfork创建的子进程与父进程之间共享数据段
vfork创建的子进程先运行,父进程挂起,直到子进程调用exec或exit之后,父子进程的执行次序才不再有限制
20.理解C的数据段、堆栈段、代码段
21.exit(1)在循环中的话,它也是直接整个结束程序,而不是跳出循环,和break不同
22?.exec函数族用来执行新的进程,以新的进程来完全代替原有的进程
?怎么和fork、vfork一起使用
23!.系统内核调度进程,没有固定的顺序,是按照随机的顺序来执行的,所以在一个程序中创建多个子进程后,子进程并不会按照代码中创建子进程的顺序来执行,是随机的顺序
24.wait、waitpid。在多进程处理时,用户可能需要用到有关进程等待的操作,这种操作可以是进程组成员之间的等待,也可以是父进程对子进程的等待
一个进程调用了exit之后,该进程并非马上消失掉,而是留下一个称为僵尸进程的数据结构。这时的处理方法之一就是使用进程等待的系统调用wait和waitpid
25.pid_t wait(int *status):
进程一旦调用wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到这样的一个已经变成僵尸的子进程,wait就收集这个子进程的信息,并把它彻底销毁后返回,否则wait就一直阻塞在那里,直到有一个出现为止
参数是用来保存被收集的进程退出时候的一些状态,它是一个指向int型的指针。但如果程序员对这个子进程是如何死掉的毫不在意,而只是想把这个僵尸进程消除掉,可用这种格式wait(NULL),参数设为NULL
如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD
26.pid_t waitpid(pid_t pid, int *status, int options),从本质上讲,waitpid和和wait作用完全相同,但是waitpid多出了两个可由用户控制的参数pid和options,从而为用户编程提供了一种更为灵活的方式。waitpid可以用来等待指定的进程,可以使进程不挂起而立刻返回。参数pid用于指定所等待的进程:
pid>0,只等待ID为pid的子进程,不管其他已经有多少子进程结束退出了,只要指定的子进程还没有结束,waitpid就一直等待下去。
pid=-1,等待任何一个子进程退出,没有任何限制,此时waitpid等价于wait
pid=0,等待同一进程组中的任何子进程,如果某一子进程已经加入别的进程组,waitpid则不会对它做任何理睬
pid<-1,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值
27.如果正在运行的程序源代码里注册了针对某一特定信号的处理函数,不论当时程序执行到什么地方,一旦进程接收到该信号,相应的调用就会发生
28?.什么是进程组
29?.时间函数
30!.0x开头是16进制数,0开头是8进制数
31!.编译gtk+开发的程序时,需要在gcc命令后加上`pkg-config --libs --cflags gtk+-2.0`,如:gcc -g -o window window.c `pkg-config --libs --cflags gtk+-2.0`
31!.读源码,要从主函数开始读起,遇到调用的函数再去读对应函数的源码……
32!.在C中,编写函数的额一个好的技巧,函数返回值只是返回函数执行成功与否,而通过地址传参方式去操作实参,并更改实参的值
在设计和使用函数和宏的时候,小心函数和宏是不是有副作用
33!.多个指针指向同一块地址,防止通过一个指针释放空间后,再通过另外的指针访问该空间,可能在不知情的情况下因此出一些错误