之前看Linux C编程记得笔记,不全面也不系统,但亦可稍作参考

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!.多个指针指向同一块地址,防止通过一个指针释放空间后,再通过另外的指针访问该空间,可能在不知情的情况下因此出一些错误

时间: 2024-08-04 17:18:15

之前看Linux C编程记得笔记,不全面也不系统,但亦可稍作参考的相关文章

很早之前看Mars的Java视频记的笔记,不系统也不全面,但亦可稍作参考

字面量: 整数如:1.2.3……它们的字面量为整型(int) 小数如:0.1.1.1……它们的字面量为双精度浮点型(double) 注意字面量的问题,因为这会涉及到数据类型转换的问题. byte.short类型稍有例外.虽然如1.2这样字面量是int型的常数,但是可以赋值给byte.short类型. 数值类型的表示范围:byte<short<int<long<float<double 时刻注意各种数据类型尤其是数值型数据类型,在进行运算的时候千万别出现数据溢出的情况! 还有一

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

linux网络编程学习笔记之四 -----多-threaded服务器

对于使用过程中并发.通过实现更轻量级线程. 每个线程都是一个独立的逻辑流. 主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元.当然,这是在微内核操作系统说.总之,这是唯一的一个操作系统内核提供了最重要的OS服务,许多人看点击打开链接 每一个线程有它自己的线程上下文.包含一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针.程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包含可运行的程序文本.程

Linux shell 编程学习笔记--第一章

1.内核从开机自检就放在计算机内存,直到计算机关闭为止,应用程序是放在计算机硬盘的,需要时才调入内存执行. 2.shell就是应用程序,它是连接内核和用户程序的桥梁.用户登入Linux系统的时候,shell就会被调入内存执行.shell图的关系..缺 3.用户有两种方式打开shell(1)通过图形界面的方式,来操作Linux操作系统 (2)两个软件,远程登录.其中登录要输入的IP没太明白,输入谁的IP 4.脚本语言和编译型语言的区别和联系.脚本语言易学难精. 1.3.1 shell脚本的基本元素

linux sheel编程学习笔记(一)

linux通配符: 通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不用在 操作符上).当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展):否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理.总之,通配符 实际上就是一种shell实现的路径扩展功能.在 通配符