![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
s2: Linux编程
文章平均质量分 51
涛歌依旧
毕业后就职于华为和腾讯
展开
-
写了ping源码,居然贼简单
大家好,我是涛哥。对于IT从业者来说,肯定知道ping命令吧,它基于ICMP网络协议,通常用于探测网络之间的连通性。用man ping可知:ubuntu@VM-0-15-ubuntu:~$ man pingPING(8) System Manager's Manual: iputils PING(8)NAME ping,原创 2022-02-06 23:11:43 · 2027 阅读 · 5 评论 -
写了一个网络聊天软件(Linux版TCP程序)
大家好,我是涛哥。在局域网内写TCP聊天程序,真的很简单。你可以通过TCP和你的女朋友聊天,图示如下: 涛歌手绘然而,如果你的女朋友在别的城市,你想写一个软件跟她聊天,那么上面的图示就不行啦。想一下,这是为什么呢?因为你们都身处在寝室的局域网中,这两个局域网是无法连通的。那怎么办呢?必须借助一个公网将网络打通。为了进行实际验证,我用的是阿里云的机器。这个阿里...原创 2021-11-15 22:26:38 · 1085 阅读 · 0 评论 -
Windows和Linux上分别怎样实现等待某个线程结束?---用WaitForSingleObject和pthread_join
Windows和Linux上分别怎样实现等待某个线程结束呢, 我们先看Windows的情形, 直接上代码:#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter){ int i; for(i = 0; i < 100; i++) { cout << "son thread" << i + 1 << endl;原创 2015-01-29 23:26:27 · 12185 阅读 · 6 评论 -
Linux C 中vfork和fork的区别
我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享。 而vfork就不同了, 利用vfork创建的子进程和父进程共享地址空间, 下面, 我们通过实际程序来看看: fork函数的简单应用:#include #include #include int main原创 2015-04-02 22:28:51 · 8876 阅读 · 4 评论 -
不区分大小写的串比较---Windows下的stricmp和Linux下的strcasecmp, 遇到了, 所以记录一下!
不区分大小写的串比较, 在实战中的应用还是很广泛的, 有时候可以增强程序的容错性, 下面我们来分别看看Windows下的stricmp和Linux下的strcasecmp Windows下的stricmp:#include #include int main(){ if(0 == stricmp("abc", "ABc")) { printf("ye原创 2015-04-02 22:10:52 · 12595 阅读 · 4 评论 -
linux下ls命令的简要模拟---顺便学学opendir、readdir函数
我们来简要模拟一下linux中的ls命令, 代码如下:#include <stdio.h>#include <dirent.h> // DIR,struct dirent,opendir, readdir原创 2015-04-24 23:00:23 · 9153 阅读 · 3 评论 -
linux下的四个简单函数介绍:getpid, getppid, getuid, getgid
直接看程序:#include int main(){ printf("pid:%d, ppid:%d, uid:%d, gid:%d\n", getpid(), getppid(), getuid(), getgid()); return 0;} 结果为: [taoge@localhost learn_c]$ echo $$2774[taoge@localh原创 2015-04-30 21:23:26 · 24889 阅读 · 16 评论 -
linux中umask命令/函数的用法简介
umask命令用得相对不多, 而umask函数则用得相对较多。 下面, 我们先来看看umask命令, 它主要用来设置权限屏蔽, 说白了, 就是间接地设置权限。 我们先打开一个linux shell终端, 执行一些命名, 得到如下的结果:[taoge@localhostlearn_c]$umask0002[taoge@localhostlearn_c]原创 2015-05-05 22:27:41 · 17971 阅读 · 0 评论 -
linux中_exit函数和exit函数的区别
先看一个简单的程序, 如下:#include int main(){ printf("hello"); while(1) { NULL; } return 0;} 习惯在Windows下写代码的朋友, 自然会说, 肯定有hello打印啊。 但是, 在gcc下的结果为:[taoge@localhostlearn_c]$gcctest.c原创 2015-05-05 21:43:04 · 10319 阅读 · 1 评论 -
open与fopen的区别
由于找不到最原始的地址, 所以给一个间接地址:http://blog.csdn.net/zyboy2000/article/details/66361871.open函数原型:int open(const char *path, int access, int mode)path 要打开的文件路径和名称 access 访问模式转载 2015-05-13 23:36:44 · 7731 阅读 · 0 评论 -
跟我一起写makefile------皓哥
转载地址:http://blog.csdn.net/haoel 作者:陈皓 说明:皓哥原来的makefile系列分散在多篇文章之中, 我在这里放到一篇中, 在此, 在此感谢皓哥的分享。 跟我一起写 Makefile陈皓 (CSDN)概述——什么是makefile?或许很多Winodw转载 2016-03-06 01:01:21 · 8346 阅读 · 2 评论 -
strtok_r并不比strtok好多少
前面批判了strtok, 本文来说说strtok_r, 后者在linux中才有, 虽然可冲入且线程安全, 但也不是什么好东西, 因为会改变原串, 如下:#include #include #include #include using namespace std;int Str2Vector(const string& str, vector &v, const char *p)原创 2016-03-28 23:54:27 · 8346 阅读 · 1 评论 -
inet_ntoa之坑------再谈不可重入函数中的static
不想用过多的话语来啰嗦, 还是看代码吧(如下结果非常让人吃惊):#include #include #include #include #include int main(){ unsigned long n1 = inet_addr("10.213.120.1"); unsigned long n2 = inet_add原创 2016-04-09 19:31:09 · 11094 阅读 · 2 评论 -
详解likely和unlikely函数
转载地址:http://blog.csdn.net/npy_lp/article/details/7175517 在Linux内核中likely和unlikely函数有两种(只能两者选一)实现方式,它们的实现原理稍有不同,但作用是相同的,下面将结合linux-2.6.38.8版本的内核代码来进行讲解。 1、对__builtin_expect转载 2016-05-20 22:18:41 · 8539 阅读 · 1 评论 -
淡疼的itoa和abs: 'itoa' was not declared in this scope; 'abs' was not declared in this scope
本来今天就被几个问题折腾得够呛, 结果下午写代码, g++又提示我:'itoa' was not declared in this scope, 尼玛, 我用itoa怎么啦? 后来发现:itoa函数不是ANSI(American National Standards Institute) C的标准, 应该避免使用这个函数. OK, 是我糊涂了, 居然想着去用itoa这么危险恶心的非标准函数,原创 2016-06-29 23:20:28 · 14478 阅读 · 0 评论 -
gdb调试core时打印出当时变量的内容------有时可以主动制造core来看变量值
有时候, 在特殊需要时, 我们可以让程序主动core掉, 来查看当时的内容。 本文来玩玩这个:#include using namespace std;class Point{public: int x; int y; };int main(){ int a = 1; int b = 2; Point M; M.x = 3; M.y = 4; int *p原创 2016-07-24 14:59:44 · 18389 阅读 · 2 评论 -
用srand, rand产生的随机数有隐患------还是用利用linux的/dev/urandom文件产生随机数吧
我们知道, rand是伪随机的, 每次都会产生相同的序列(因为种子相同), 而srand可以产生种子, 我们经常用srand(time(NULL))来产生种子, 当种子随着时间变化时, 就会产生不同的序列, 然而这就够了吗? 今天碰到这样一个问题: 在很短时间(比如1s)内, 需要产生较好的随机数, 此时用srand(time(NULL))是失效的, 因为ime(NULL)的值原创 2016-06-29 23:31:27 · 9766 阅读 · 1 评论 -
如何验证linux进程打开文件数的默认最大值(通常是1024)? 知识点: ulimit; watch -n 1 'ls -l /proc/xxx/fd | wc -l'
曾经在某公司的笔试题中出现了这样一个题目:linux进程打开文件数的默认最大值是多少? 我当时想, 这不是为难人么? 谁记得住呢? 用ulimit命令查一下不就知道了么? 其实, 本题不过是在考一个简单的常识。 这种题放在校招题目中, 毫无意义, 如果是社招, 那倒是情有可原。 我们来用命令查一下:taoge@localhost Desktop> ulimit -acore原创 2016-07-02 12:13:22 · 10500 阅读 · 1 评论 -
makefile同时指定多个同名头文件/库文件, 那实际到底采用的是哪个呢?
虽然是10月8号了, 但仍然处在休假中, 这种感觉不错。 为了避免节后综合征导致上班没精神, 所以今天就开始在家玩玩代码, 提前进入工作状态。 今天, 我们来看看这样一个问题:makefile同时指定多个同名头文件或库文件, 那实际到底采用的是哪个呢? 我们先说头文件。 在实际开发中, 一些公共的头文件, 经常被到处拷贝, 这是常有的事原创 2016-10-08 12:47:41 · 11642 阅读 · 2 评论 -
用实例程序再聊makefile指定头文件和库出错的那点破事
在文章http://blog.csdn.net/stpeace/article/details/50985578中, 我说过makefile指定头文件和库文件出错的那点破事, 今天破事重提, 用实际例子来聊一下.taoge@localhost Desktop> cat basic_add.cint basic_add(int x, int y){ return x + y;}ta原创 2016-10-21 22:38:40 · 7890 阅读 · 1 评论 -
google protobuf 在Linux下安装与使用 (亲自测了一下, 确定可用!)
转载地址:http://blog.csdn.net/codeheng/article/details/42744875 转载说明: 我本人亲自试了一下, 原文方法完全OK, 感谢原作者。 一、介绍 首先,protobuf是一个开源项目,而且是后台很硬的开源项目。网上现有的大部分(至少80%)开源项目,要么转载 2016-11-04 01:57:13 · 11706 阅读 · 1 评论 -
make -k(keep going)命令会在发现错误时继续执行(用于一次发现所有错误)
我们在执行makefile进行编译的时, 会经常遇到错误, 然后解决, 然后又make, 然后又发现错误, 然后又解决, 烦人, 能不能一次发现所有错误呢? 能的! main.cpp很简单, 我们只看makefile(故意写成错误的g+++):main: main.o g+++ -o main main.omain.o: main.cpp原创 2016-11-05 22:55:58 · 12687 阅读 · 1 评论 -
linux预处理、编译、汇编、链接和运行的过程
看个简单的程序(test.c):#include int main(){ printf("abc\n"); return 0;} 我们可以这样搞定编译和运行:taoge@localhost Desktop> gcc test.c taoge@localhost Desktop> ./a.out abc 可是, 你知道它经历了原创 2016-10-21 08:45:35 · 8646 阅读 · 1 评论 -
一个与map下标操作有关的编译错误(花了5分钟才找到原因)
来, 看程序:#include #include #include using namespace std;class A{public: map m_map; };void test(const A &a){ string s = a.m_map["hello"]; cout << s << endl;}int main(){ A a; a.m_map原创 2016-10-21 09:22:26 · 10866 阅读 · 1 评论 -
该用配置的时候, 就不要宏定义
我们经常需要调节网络服务的超时时间设置, 如果把这个超时时间放在代码中, 则很笨重, 不灵活。 万一需要调整, 那就蛋疼了, 说不定就会编译不过, 编译过了, 发布也是风险重重。总之, 是一个重操作, 费时费力。 写代码的时候, 还是考虑下扩展性吧, 该配置的时候, 就不要偷懒地宏定义! 尤其对于哪些经常变化的设定参数。原创 2016-12-11 00:57:02 · 7350 阅读 · 0 评论 -
实例介绍利用valgrind定位内存泄漏问题
在前面的文章中, 我们简单了解了valgrind工具的用途以及安装, 以便大家能进行实际操作。 在本文中, 我们通过实例来看看如何利用valgrind来定位内存泄漏问题。 先看程序:#include <stdio.h>#include <stdlib.h>char* getMemory(){ char *p = (char *)malloc(30); return p;}int main(){ char *p = getMemory(); p = NULL; return 0原创 2017-03-12 17:36:56 · 22931 阅读 · 7 评论 -
实例介绍利用valgrind定位内存异常释放问题(double free 和wrong free)
之前介绍过利用valgrind来定位内存泄漏(慢性病, 会导致程序在某个不确定的时刻异常), 本文我们来简要介绍利用valgrind来定位内存的重复释放(急性病, 会报纸程序崩溃)。 看程序:#include #include #include int main(){ char *p = (char *)malloc(30); free(p); free(p); re原创 2017-03-12 18:48:53 · 12508 阅读 · 2 评论 -
实例介绍利用valgrind定位内存非法访问问题
本文继续介绍 valgind的使用, 看程序:#include int main(){ int a[100]; a[10000] = 0; return 0;} 用valgrind分析:[root@xxx ~/valgrind-3.8.1/bin]# ./valgrind --tool=memcheck --leak-check=yes --s原创 2017-03-12 19:07:54 · 10696 阅读 · 1 评论 -
实例介绍利用valgrind定位memcpy内存重叠问题------顺便再次说说memcpy和memmove的区别
继续介绍valgrind的使用, 看程序:#include #include #include int main(){ char a[] = "abcdefghijk"; memcpy(a + 1, a, 5); printf("%s\n", a); return 0;} 先看看结果:[root@xxx ~/valgrind-3.8.1/bin]原创 2017-03-12 19:25:40 · 8680 阅读 · 1 评论 -
实例介绍利用valgrind定位strcpy/strncpy/strcat/strncat内存重叠问题
和前面的memcpy类似, strcpy/strncpy/strcat/strncat都存在内存重叠问题, 为了简便示意起见, 我用strcpy做例子来说明。 值得注意, 有时候, 在你的环境下, strcpy没有出现如下的问题, 不表明他真的没有问题。 看程序:#include #include int main(){ char str[100] = "abcdefghijklmn"原创 2017-03-12 19:55:39 · 7672 阅读 · 3 评论 -
实例介绍利用valgrind定位变量未初始化的问题
继续介绍valgrind的用途, 看程序:#include #include int main(){ int i; if(i == 0) { printf("[%d]\n", i); } return 0;} 一眼就能看出程序的问题, valgrind分析如下:[root@xxx ~/valgrind-3.8.1/bin]# g++ -g test.cp原创 2017-03-12 20:07:35 · 8267 阅读 · 4 评论 -
强大的linux tool------valgrind的简介以及安装
valgrind是linux下的一个强大工具, 其子工具(通过toolname参数来控制)主要有: 1、memcheck:检查众多内存问题,如泄漏、越界、非法指针, 我们将一一介绍。 (如果省略toolname, 则默认是memcheck, 比如执行: ./valgrind ./a.out) 2、callgrind: 分析程序性能。 3、cachegrind:分析cache. 4、helgrind: 分析多线程竞争。原创 2017-03-12 17:05:56 · 22863 阅读 · 4 评论 -
简单说说zlib.h,libz.a/libz.so库和-lz
在编译的时候, 偶尔会出现cannot find zlib.h头文件, 或者cannot find -lz的提示, 其实, 这就涉及到zlib.h和libz.a/libz.so库, 这个库主要用于提供压缩和解压缩等基础能力。 类似地, 遇到以下库要认识:libz 压缩库(Z)librt 实时库(real time)libm 数学库(math)libc 标准C原创 2017-04-02 23:26:29 · 22408 阅读 · 1 评论 -
用abort函数主动让进程abort/coredump, 有什么用处?------曾用此方法解决过一个低概率开机卡死的问题
之前玩过一段时间的嵌入式设备(如下叙述以手机为例)的软件开发, 当时出现了一个低概率问题: 系统开机会低概率卡死在某个模块中。 这个问题必须解决。 如果有问题的手机发布到用于手中, 假设概率万分之一, 那也非常高了, 想想某手机厂商的电池爆炸事件吧, 那是何等的低概率, 但还是发生了。 怎么定位呢? 我之前大致说过, 今天再来看看方法(如下简单示意):原创 2017-03-25 15:55:09 · 11952 阅读 · 4 评论 -
struct timeval和gettimeofday小记
struct timeval是一个时间结构体, 具体字段分别是秒和微秒, gettimeofday是具体获取时间的函数, 看个程序就明白了:#include#includeint main(){ struct timeval tv; gettimeofday(&tv, NULL); printf("second:%d\n", tv.tv_sec); // second 秒原创 2017-04-02 22:51:05 · 8931 阅读 · 1 评论 -
静态库调用静态库&静态库加载静态库------谈谈undefined reference to和linker input file unused because linking not done
这里就有问题了,libbusiness.a/business.h对外并不独立, 我们来看一个work得好好的案例: business.h:#include using namespace std;void business(); business.cpp:#include #include "business原创 2017-06-16 21:57:34 · 13446 阅读 · 0 评论 -
关于udp socket recvfrom函数的一个易错问题: 如果应用程序指定的接收长度不够怎么办?
我们来看这样一个问题, 在udp socket变成中, sendto连续三次发送10个字节的数据,原创 2017-06-29 22:07:24 · 19317 阅读 · 8 评论 -
用实际程序来测试udp sendto函数的最大发包大小------为什么是65507?
我们知道, IP包头有一个16bit的长度, 对应的二进制最大值是2^16 -1,也就是说一个IP包整个长度的最大值是2^16 - 1 字节, 如果考虑UDP通信, 那么除去IP头的20个字节, 除去UDP头的8个字节, 还剩2^16 - 1 - 20 - 8 字节。 我们来玩玩程序(本文只以客户端发数据为例)。原创 2017-06-29 22:16:15 · 10786 阅读 · 2 评论 -
connect函数与karn算法
先看connect函数:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(){ int sockClient = s原创 2017-07-01 00:06:09 · 7591 阅读 · 3 评论 -
用实例说明为什么udp包头部的包长是冗余的
熟悉IP/TCP包结构的同学一定知道, 在TCP包中, 是没有字段标注整个TCP包长度的, 为什么呢? 因为完全可以根据IP包的信息来计算出TCP包的长度。 但是, 在IP/UDP中, UDP包头居然给出了整个UDP包的长度, 这个信息不是冗余的吗? 看过《TCP/IP详解》这套书的同学肯定知道, UDP包长信息, 确实是冗余的。 来看看:#include #include原创 2017-07-01 10:37:06 · 8443 阅读 · 5 评论