UDP报文最大长度

udp-header

tcp-header

UDP

由于udp报文头中使用16bits表示长度,因此最大长度是2的......

pthread_join函数使用误区

pthread_join函数项目里一般使用第二个参数都使用NULL,不关心线程执行后返回值,有同事发我一段程序,运行后程序segment,却找不到原因,鉴于此本文记录pthread_join的基本用法,文章末尾会给出这段程序,并分析原因。stackoverflow上有一个比较好的问答,介绍了pthread_exit和pthread_join组合使用的习惯用法:

#include <stdio.h>

#include <pthread.h>

#include <stdlib.h>

#include <string.h>

void* thre......

一个volatile引发的血案

周六项目组加班赶进度发布版本,遇到一个奇怪的问题,根据代码分析必走的逻辑居然没有打印日志,简直有点怀疑人生了。恰好昨晚看APUE信号章节时有看到书中明确说明,如果不加volatile,就会导致开启编译优化时去除循环语句的问题。

最终根据提交记录发现有人将整个项目的编译选项由原来的O1修改为了O3,优化理由是:提高程序的执行速度。当然是用优化选项O3能够提高程序的执行速度,代码如果写的有问题,会导致意想不到的问题。有意思的是我追查了下代码改动记录,15年的时候就有人尝试将O1修改为O3,过了几天又改动回来,估计是搞不定各种奇奇怪怪的问题。

改编自APUE示例代码:

#include &......

setjmp与longjmp

最近换了一种方式看APUE,直接看source code,如果这个程序看完没有疑问,并且执行结果与预想中的一样就跳过,看到第10章信号的时候源码中居然有setjmp和longjmp,之前的理解是这两个函数不就是加强版的goto吗?前几天写了篇文章段错误segment fault分析,函数调用会涉及到函数信息入栈出栈,所以这看似简单的两个函数,程序执行背后有着复杂的函数栈切换过程。

apue信号章节中引入setjmp和longjmp函数是为了解决例子sleep1.c中存在的第三个问题。

#include <signal.h>

#include <unistd......

EINTR信号介绍

code review的时候看新来的同事重复造了个轮子,使用open read write函数实现了与windows平台对应的函数CopyFile。不过他造的轮子有缺陷,没有处理信号EINTR。这篇文章通过EINTR为引子,来总结linux下与之相关的知识点,本篇文章将继续秉承想到哪写到哪的原则,由于平时大都写一些固定套路代码,如果在本文中有任何错误,欢迎指出。

从信号说起这篇文章中重点介绍了进程状态T(停止 traced or stoped),本篇开头先讲下进程状态D。

进程状态D

man ps手册中关于进程状态的描述:

PROCESS STATE CODES

Here are......

exec家族execvp函数使用趣事

公司一小兄弟问我:execvp函数执行后不返回,如何将申请的内存释放掉呢?还专门发我一个不知道从哪个英文网站copy的例子,问我使用valgrind怎么没有检测出来内存泄露,你不是吹valgrind吹的天花乱坠吗?这个例子仅仅为了说明这个问题,如果换成myargs[0] = "wc";这种写法,就不会存在本篇文章了。

完整例子如下:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <fcn......

系统调用跟我学

系统调用跟我学

最近浏览到一篇不错的文章,略带有科普性质,原文链接:

系统调用跟我学一

系统调用跟我学二

系统调用跟我学三

系统调用跟我学四

coredump

最近在定位一个非必现的问题时存在一个认识错误,在linux中开启coredump的脚本如下:

#!/bin/bash

### Filename: coredumpshell.sh

### Description: enable coredump and format the name of core file on centos system

# enable coredump whith unlimited ......

网络序与主机序

用一个例子演示htons的用法,用于编译的centos虚拟机为小端模式,因此下面的程序输出为

10 00

4096

与htons函数类似的几个函数及对应的作用如下:

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

Description

The htonl() function converts the unsigned integer hostlon......

epoll实例

epoll的示例网上很多,个人认为这个例子最能反映epoll的用法,最近在看libevent的源码,按照目前的工作繁忙情况也只有周日一天有时间看看,有点想念以前时间比较多,可以写一些学习笔记。

计划后续写一些livevent源码学习笔记。io多路复用可以参考我的另一篇文章io多路复用

getaddrinfo可以参考man手册的例子:getaddrinfo

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <sy......

可重入和非可重入函数

可重入和非可重入函数

深入理解可重入函数为何物,首先需要区分单线程程序和多线程程序。典型UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令。而对于多线程程序而言,同一进程却存在多条独立、并发的执行逻辑流。

多线程程序与使用了信号处理函数的程序中需要注意函数是否可重入,因为信号处理函数可能会在任一时刻异步中断程序的执行,从而在同一个进程中实际形成两条(主程序和信号处理函数)独立(虽然不是并发)的执行线程。