linux下C编程
文章平均质量分 79
lotluck
我会成为你的眼睛,为你看清未来
展开
-
linux下C编程(一)之 hello world
很多人知道在用C语言敲出来hello,world很容易,但是大多数都不知道每一步具体是怎么样的,下面我也简单说要下吧!先给出闭着眼睛可以敲出来的hello world程序。 #include int main(int argc,char *argv[]){ printf("hello,world\n"); return 0;}• 在linux和Unix原创 2015-10-17 21:39:23 · 1068 阅读 · 0 评论 -
进程间通信(IPC) 之 共享内存 和 闲扯其他一些东西
其实,写这篇文章是带着多么激动的心情,终于没有bug这一篇有好几处我还要在加强练习。在进程间通信(IPC),函数好多,好多都没有记住,查man的时候就特别烦,一大段一大段的英语,看的一个头有8个大,先来谝谝共享内存。 先说说我理解,对于共享内存,我感觉这效率还是很高的,因为内核基本上说不干预,说的最好(IPC之中)原创 2016-01-19 00:47:07 · 958 阅读 · 2 评论 -
webbench学习源码
深入学习一个语言或者想提升自己的编程水平,最好的办法就是学习优秀的源代码,一个意外的机会,接触到了webbench的源码,里面认认真真的看下去真是get到不少东西。webbench就是一个用纯C语言实现压测工具,思路很简单,主进程创建出多个子进程,让多个子进程去访问url,记录子进程访问该网页的情况,主进程和子进程之间采用管道通信,最后主进程汇总子进程的数据结果,就是这么简单。 在webbench源码中,有很多技巧值得学习,如何组织代码让代码精剪一目了然,如何巧妙的使用全局变量,而且大量的字符串处理函数st原创 2015-01-26 16:14:31 · 942 阅读 · 0 评论 -
tinyhttpd源码
之前接触了webbench源码,感觉还阔以美滋滋,有时间了意外又看到了tinyhttpd源码,不错,好的我还是引用人家的话。tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。下载链接:http://sourceforge.net/projects/tinyhttpd/ 代码整体思路还是很清晰,也就12个函数,没有什么比较难的地方。我学习这个主要还是加深对C语言原创 2015-02-19 13:19:19 · 1354 阅读 · 0 评论 -
linux的read,write
本来都不想写了,距离回宿舍还有一点时间,快速写一篇,因为从这里就要进入的系统编程,我们直接对内核进行调用,而对于那些高级语言的人们,他们是通过了类库,然后接触内核,这一块也要好好学习,今天入入门。 我现在写代码都有自己的规范,变量每个写一行,不管怎么样都进行初始化,尽量不要出现魔鬼数字,比如返回-1,-2,直接用宏定义。fd文件描述符。我感觉这里的知识多的很,而且很细,想文件描述符原创 2016-01-02 22:20:22 · 745 阅读 · 0 评论 -
linux C 获取cpu数目
我们现在写的代码一定要考虑可移植性,就举一个很简单的例子,一个进程开启的线程数量与CPU个数相关,而不同的机器CPU的数目不同,当我们代码从一个机器移到另外一个机器的时候,我们就不要手工修改先关参数,直接写代码自动获取CPU数目从而自动生成合适的线程数目。原创 2015-02-19 13:17:38 · 2192 阅读 · 0 评论 -
段错误bug的调试
我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。下面将就以下的一个存在段错误的程序介绍几种调试方法:述作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通转载 2015-01-21 01:17:21 · 1259 阅读 · 0 评论 -
关于读写锁pthread_rwlock_t
当我们使用pthread_rwlock_rdlock()获取一次读锁时,__nr_readers字段就会加一,注意,就算是同一个线程,在已经获得读锁的情况下,再去获取读锁,__nr_readers字段仍然会加一的,当我们调用pthread_rwlock_unlock()一次时,__nr_readers就会减一,如果我们重复加了读锁,必须重复调用pthread_rwlock_unlock()来使__nr_readers减一,否则其他线程再想获取写锁时,是会阻塞的。 2.__writer记原创 2015-06-30 23:53:28 · 1580 阅读 · 0 评论 -
提升自旋锁spinlock的性能-pause指令
看源码的时候get的一个新的知识点,可以提升自旋锁spinlock的性能-pause指令,看到的源码如下: #define cpu_pause() __asm__ (".byte 0xf3, 0x90") #define NOP_CPU3(n) {int i = 0; while(i++ < (n)) cpu_pause();} // 调用代码原创 2017-10-24 14:22:43 · 3668 阅读 · 0 评论 -
共享内存映射之mmap()函数详解
共享内存映射之mmap()函数详解 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中转载 2015-09-01 21:59:10 · 542 阅读 · 0 评论 -
GCC在C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例:__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm__"的别名。"__volatile__"表示编译器不要优化代码,后面的指令 保留原样,"volatile"是它的别名。括号转载 2017-10-24 09:46:19 · 614 阅读 · 0 评论 -
利用排序那点事来说说函数指针好在哪里?
看了一下有些人写的关于函数指针的文章,对于初学者学习起来有点费力,原因很简单——没有具体的代码演示,理解的自然而然不那么深刻强烈,总感觉有点空洞。我今天用大家很清楚的排序代码来说说函数指针好在哪里?先提一下函数指针与指针函数以免搞混淆,其实很好区分,就按照字面意思来理解, 函数指针:一个指向函数的指针,本质是指针。原创 2015-09-02 12:44:38 · 457 阅读 · 0 评论 -
linux解析命令行参数getopt_long
在一些小程序的函数中,程序猿可以很好的维护和管理程序(修bug,增加函数),但是在一些大程序里面往往有许许多多的函数,如果仅仅靠程序猿维护的话根本就忙不过来,费时费力,也不现实,在面向对象中,面向对象语言的基本单位是类(Class),她封装了数据成员(属性)和成员函数(方法),将最小组件的提高了一个等级,程序员需要直接操作的不是过程和函数,而是更高层次上的类。虽然提供了很多的方法和属性,但是每种不原创 2014-10-13 01:57:36 · 946 阅读 · 0 评论 -
利用aio+epoll简单改写sendfile
其实说白了,也就是想直接尝试利用一下aio +epoll结合代码,在利用人家sendfile的接口,就是替换sendfile,自己随便玩玩传输文件。我采用的是linux原生的libaio,glibc实现的aio貌似很多在吐槽,性能也不好直接别抛弃了。 这里提一下linux libaio的相关结构体,这些可以在/usr/include/libaio.h文件看到,也有io_prep_pread和原创 2017-08-17 15:55:26 · 1387 阅读 · 0 评论 -
linux下C编程(三)之 const 的值可以被修改
1.先从最简单的什么类型占多少字节开始吧,因为我用的是64位,因此所用全都是64位上的运行结果。这些总结一次下次就算忘记了,也可以很快的想起来。 #include int main(int argc,char *argv[]){ //定点数 char a = 10; short b = 20; int c = 30; long d = 40原创 2015-10-19 16:11:53 · 1134 阅读 · 0 评论 -
linux下C编程(五)之unsigned 的大坑货和 char 和浮点数
说起unsigned,这个还是听起来不错的,无符号。 unsigned char a; 她的范围是( 0~255),如果是char a;那么她的范围是(-128 ~+127),一会再说为什么当是char的时候范围是(-128 ~+127)。先说很坑的unsigned, 我们一般知道0 -1 =-1,这个无可质疑,但是如果你定义的是unsigned,那么0-1=255,对,你没有看错。也许原创 2015-10-19 18:20:22 · 2899 阅读 · 0 评论 -
linux下C编程(四)之*p++=*q++
真的被这个指针弄得差点崩溃了,还算好,今天终于理解下面的这个程序了,变量放在双等号的右边,常量放在左边,结果出现了这个样子的东西,然后我就傻眼了。*p++=*q++,这一篇下面的程序会出现错误,因为这样指针p的地址早都变化(*p++),这个指针成为野指针了,对于指针q也是如此。 #include int main(int argc,char *argv[]){ int i原创 2015-10-19 17:51:43 · 2569 阅读 · 0 评论 -
linux下C编程(二)之 strcpy strncpy
简单实现 char *my_strcpy(char *dest_str,char *sour_str);#include //函数的声明char *my_strcpy(char *dest_str,char *sour_str);//函数的具体实现char *my_strcpy(char *dest_str,char *sour_str){ char原创 2015-10-17 22:14:29 · 638 阅读 · 0 评论 -
memmove() 和 memcpy()
memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,原创 2015-11-08 20:37:13 · 872 阅读 · 0 评论 -
实现字符串的一些常用字符串函数
1 size_t my_strlen(const char *string); // 字符串长度 size_t my_strlen(const char *string) // 字符串长度{ int len = 0; const char *str = string; if(string == NULL){ return len;原创 2015-11-10 20:57:17 · 412 阅读 · 0 评论 -
linux下C编程(六)之 void用法大总结
这次对void差不多有点多少的理解了,从最初的理解就是空,么有的意思。首先void是C语言中的关键字,对函数返回值的限定,对函数参数的限定。1.void*常常被称为空指针,其实理解为指向任意类型的指针比较合适,as we all kown,如果指针p1和指针p2的类型相同,那么才可以相互赋值,类型不同的话,有必要在此之间进行强制类型转化。而任意类型的指针都可以直接赋值给void*。in原创 2015-10-25 21:39:07 · 3017 阅读 · 0 评论 -
linux 下C编程(七) 之 杂杂的程序
#include #include int main(int argc,char *argv[]){ char *str = "sgdjsgfjsdj\ndskjf\nsdad\t swd asd sad\n"; char *pstr = str; int num[256]={0} ; int i; while(*pstr) {原创 2015-10-25 21:55:23 · 622 阅读 · 0 评论 -
关于linux的读写锁
这次当我给面试官提及到读写锁的时候,详细问了我的读写锁,我知道怎么回事,用法,但是具体没实践过,听过的还是不要给面试官说了,不然又给自己挖坑。 下面这个程序就是读写锁的程序,分别有两个读者,两个写着,当写着输入end的时候并且读者读到程序运行结束,里面的读写锁是动态初始化,最后用pthread_join(),主要主线程等待子线程运行完她才可以结束。对于现在锁,我才感觉到都是有套路的,都被玩原创 2016-04-07 20:09:00 · 3503 阅读 · 1 评论 -
整理桌面,杂碎的常用的知识点
虽然两个电脑屏幕,但是都用成这个样子了,差点快满屏幕,今晚闲来无事,整理整理桌面杂碎的知识,最近也在积极的准备面试中,家都回不了。桌面成这个样子了,敢看?等等面试结束了,好好整理一番。桌面上的tcpdump,linux下的抓包分析数据神器,简单好用比windows下的wireshark好用多了;对于什么时候会接受到一个rst包呢,服务器都没开这个端口原创 2016-08-14 21:18:57 · 681 阅读 · 0 评论 -
用send简单改写sendfile64
这篇博客就是在成熟的nws框架下面, epoll采用边缘ET方式, 用send简单改写一下sendfile64,算是熟悉一下流程。 epoll的ET方式只有在写缓冲由满到不满或者读缓冲区由空到非空时候才触发,所以我们每次利用send发送数据一定要填满内核发送缓冲区,才可以触发下一次epoll事件。 这是需要改写的sendfile函数 : n = sendfile64(ofd, ifd, (off64_t*)&offset64, count); 我呢只把这些参数传递到我改写的函数里面,直接利用就行,这些值原创 2014-10-16 08:44:24 · 2066 阅读 · 0 评论 -
好用的valgrind
对于这个valgrind,目前我仅仅使用了它的检查内存是否泄漏的问题,我们经常在写代码的时候,如果只malloc开辟了空间,而忘记free释放空间的话就会内存泄漏。如果用这个工具的话,那么就简单多了。 valgrind的官网下载http://valgrind.org/downloads/ 网上也有很多安装教程,我的主机是centos6.5。我在这个上面安装成功了。原创 2015-12-22 09:28:50 · 904 阅读 · 0 评论 -
mmap其实并没有那么好
现网问题关于mmap的基本操作自行google去吧, 一抓一大把,99%基本上夸mmap是有多好多快,mmap快是因为建立了页到用户进程的虚拟空间映射,以读取文件为例,避免了页从内核态拷贝到用户态, 少了一次拷贝,而且在内存中操作,从这个层面看,mmap是屌屌的。但是在现网使用, mmap带来很多问题。 图一: 内存吃紧,swap也是关闭, 该进程使用内存状况 图二: 该进程 mm...原创 2018-08-13 16:18:39 · 18525 阅读 · 2 评论