intptr_t 是比 void * 更好的选择吗


intptr_t 是何方神圣

相信大多数程序员对 intptr_t 比较陌生的,也不要认为是 int 类型的指针。其实这个和 int 没什么关系,也不知道定标准的人是怎么想的= =

intptr_t 是C语言标准委员会 C99 标准中新加的类型, 它占用的空间始终与平台上地址位数相同,因此用来存放地址。


接口中如何定义空数据


提出问题

前后端常用的 json 格式进行传输,那么怎样来表示空数据呢?空字符串返回 null 还是 "" ,数字返回 null 还是 0 ,列表呢?

这种需要前后端协商一致,一百个项目会有一百个规范,也没有人教你怎样定义更合理,都是通过经验,协商磨合和妥协中产生的。我这边说说按我的经验空数据的定义方式。


Node子进程执行ping操作,获取统计信息


需求:采用ping -t方式不断进行ping操作,直到收到关闭信号or某个超时时间时结束操作,获取统计信息。

分析:

在cmd窗口进行ping -t操作,会一直进行ping,直到输入ctrl+C会输出ping统计信息。

kill('SIGINT') 即模拟ctrl+C终止进程

编码:

这里我自己手动进行统计信息,原因见下面分析。

var exec = require('child_process').exec;
var iconv = require('iconv-lite');
let ping = exec(`ping www.google.com.hk -t`, { encoding: 'binary'}, function (err, stdout, stderr) {
    let send = 0
    let accept = 0
    let lost = 0
    let min = Infinity
    let max = -Infinity
    let avg = 0
    let Min = (a,b)=>a<b?a:b;
    let Max = (a,b)=>a>b?a:b;

    let str = iconv.decode(new Buffer(stdout, 'binary'), 'GBK')
    console.log(str);
    console.log('=========')
    let regAccept = /来自 .*的回复: 字节=(\d+) 时间=(\d+)ms TTL=(\d+)/g
    let regAll = /\n/g
    send = str.match(regAll).length - 2
    send=send<0?0:send
    let res
    while (res = regAccept.exec(str)) {
        accept++
        let tim = Number(res[2])
        min=Min(tim,min)
        max=Max(tim,max)
        avg= (avg*(accept-1)+tim)/accept
        console.log(res[1], tim, res[3],avg)
    }
    console.log('=========')
    console.log(`发送:${send};接收:${accept};丢失:${send-accept};${(1-(accept/send))*100}%丢失`)
    console.log(`最短:${min}ms;最长:${max}ms;平均:${avg}ms`)
});
ping.on('close', (code) => { console.log('close by', code) })
setTimeout(function () {
    ping.kill('SIGINT')
}, 5 * 1000);

想通过ping.kill('SIGINT')去关闭exec子进程。

测试结果是:输出了close by null后,程序依然再运行,并且没有输出统计信息。