linux C编程规范心得

1.变量名、函数名、类型定义、全局变量使用英文单词简写或全称;
2.局部变量名首字母小写,其他词组首字母大写(如 int rowIndex),全局变量、类型定义和函数名定义所有单词组首字符大写;
3.全局变量变量名末尾加"_G"以示区分,为了程序的安全性、可靠性在程序功能模块设计的时尽量少的使用全局变量;
4.对于函数名尽量使用动宾词组的单词组合;
5.设计扇入合理扇出(小于7)的函数,模块中的功能函数中的变量尽量不要直接使用全局变量,对于传入参数在函数体内不能修改其值的变量,在修饰符上加上const;
扇入指有多少上级函数调用它,扇出指一个函数直接调用控制其他函数的数量;
6.减少函数本身或函数间的递归调用;
7.注重编写代码的代码效率、局部效率、全局效率、时间效率和空间效率;

8.编写代码尽量考虑更多更高的代码移植性,提高代码的重用性;

9.高并发编程时慎用malloc动态分配内存,使用动态分配内存会占用过多的系统CPU资源;

10.记住函数所有参数传递都是值传递,指针类型同样,只是指针复制的是指向地址空间的复制;

11.对于传入参数值不能改变时,函数定义时使用const修饰符;

12.如果在进程中注册某中或多种信号处理函数,当这些信号在进程阻塞于某种慢系统调用(socket的accept,connect,write,read等sleep定时等 )时发生,这类慢调用将立即返回错误信息,并设置errno的值为EINTR(4);在信号处理函数中不要使用锁机制访问临界资源,当信号发生正好在进程调用锁机制访问临界资源是会导致自锁;

13.进程ID在整个系统中唯一,对于不同进程的线程ID可能重复,线程ID只在其所属的进程有效,对于同一进程中线程ID唯一;

14.在创建子进程之前由父进程打开的文件描述符,在创建子进程后文件描述符的引用计数递增1(对于高并发应用程序在创建子进程后父进程不使用此文件描述符应该立即close掉,这样可以防止文件描述符在子进程中不能这样真正关闭掉,且回收父进程中文件描述符的资源,避免由于父进程打开过多的无用文件描述符使资源耗尽,导致引用程序崩溃),当在相应进程中close()文件描述符只是将文件描述符的引用计数递减1;只有当文件描述符的引用计数为0时,应用程序才真正将文件描述符关闭(当程序退出时,不管文件描述符的引用次数是否为0,系统内核在在程序退出时都会回收文件描述符资源,并做相应处理,如网络套接字在正常close时会发送FIN分节进行关闭ACK应答请求);

15,当在进程中close套接字文件描述符,且该套接字文件描述符的引用计数为0时,应用程序只是将该套接字文件描述符标记为关闭状态,在该应用程序中所有进程或线程都不能使用该描述符进行读写操作,同时由内核将标志位为(FIN=1,ACK=0)的结束报文添加到数据链路的发送队列中,待所有数据都发送完毕后,再将(FIN=1,ACK=0)的报文发送到对端;

16.使用方法接收来自套接字描述符缓冲区中的的数据时,可能的返回值有-1(代表有异常情况发生),0(代表对端已经发送(FIN=1,ACK=0)的报文主动请求断开连接,接收此报文的接收端将此报文添加到所有接收数据之后,作为接收端套接字读文件结束符,当返回0时表示接收端读到此文件结束符,并发送(FIN=1.ACK=1)的报文到对端,对于接收端阻塞套接字此后再从套接字读缓存区中读取数据时都将返回0;此时对端已经在等待接收端发送(FIN=1,ACK=1)的读关闭报文,当对端接收到(FIN=1,ACK=1)的报文时将关闭对端套接字写链路。当接收端接收到(FIN1,ACK=0)的报文后再向对端写入数据时,内核将向含有该文件描述符的进程发送一个SIGPIPE的信号,SIGPIPE的默认处理方式是终止进程运行,为避免接收到此信号后,程序崩溃应捕捉此信号。此信号对于线程则无效),大于0的数(表示从缓存区中接收到数据的长度);

17.signal(SIGCLD,SIG_IGN)中产生SIGCHLD信号的语义为:子进程状态改变后产生此信号,父进程需要调用一个wait函数以确定子进程的结束状态,并回收子进程占用的资源,避免子进程成为僵尸进程(如果父进程不调用wait函数或者signal函数捕捉子进程的结束状态,在父进程结束后将由系统init进程回收父进程和其创建的子进程的所有资源,此时父进程没有wait的状态,在高并发中为了避免此种程序中资源浪费,应该在子进程结束后回收其资源),对于SIGCLD的早期处理方式如下:如果进程特地设置该信号的配置为SIG_IGN,可让内核把僵尸子进程转交给init进程去处理,则调用进程的子进程将不产生僵死进程;但是当在父进程中同时设置signal(SIGCHLD,SIG_IGN)和wait接收子进程退出的状态,将导致wait函数接收不到子进程的退出状态,此时wait返回错误码-1设置errno为10(No child process);

18.main(int argc,char **argv)argc表示传入参数数量,默认值为1,因为执行的文件的文件名就是一个参数,argv指向传入参数的字符串的指针,其中argv[0]表示执行指令的文件字符串指针,argv[1]开始才是传入的真正参数;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值