系统程序员成长计划

线程参数共享的问题

执行如下三个例子,观察执行结果,分析原因:

#include <stdio.h>

#include <pthread.h>

#include <assert.h>

void *start_routine(void * param)

{

int index = *(int *)param;

printf("%s:%d\n",__func__,index);

return NULL;

}

#define THREADS_NR 10

void create_test_threads()

{

int i = 0;

......

无锁队列

在分布式系统中经常会使用到共享内存,然后多个进程并行读写同一块共享内存,这样就会造成并发冲突的问题, 一般的常规做法是加锁,但是锁对性能的影响非常大,所以就搞出来了一个无锁队列。

无锁队列的关键原理是CPU提供了一个指令CAS,这条指令是一个原子指令,执行过程中不允许被打断。

它接受三个参数:需要修改值的地址、旧值、新值;CAS指令执行时先读取该地址的当前值,将当前值于旧值进行比较, 如果相等则说明此值没有被修改过将当前值更新为新值,操作成功;

如果不相等则说明此值被其他进程修改过,直接返回失败,此时需要程序重新读取最新的值,再次调用CAS指令进行更新,重复此步骤直到成功......

chroot用法

chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:

增加了系统的安全性,限制了用户的权力:

在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。......

Linux C 信号使用

结合几个短小精悍的例子,学习Linux C信号的基本使用,给出程序运行方法和结果。

#include<stdio.h>

#include<signal.h>

#include<unistd.h>

void sig_handler(int signo)

{

if (signo == SIGINT)

printf("received SIGINT\n");

}

int main(void)

{

if (signal(SIGINT, sig_handler) == SIG_ERR)

printf("\ncan't catch SIGINT\n");

//......

df与du命令的区别

apue课后题4.7在运行图 4-16 的程序时,使用了 df(1) 命令来检查空闲的磁盘空间,为什么不使用 du(1) 命令?

这里首先介绍下du和df的区别,再回答上面的问题。

1) du == Disk Usage

How much disk space is being used by these files?

2) df == Disk Free

How much free disk space do we have?

参考stackoverflow

这里有个非常经典的答案:

You most probably know that you can remove......

Linux下LD_PRELOAD的简单用法

在阅读某大佬写的一篇blog,里面有提到LD_PRELOAD技术作为调试和测试手段,学习该知识点,主要参考文章:

Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs

LD_PRELOAD用法

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib>/usr/lib。程序中......

ipcs命令详解

ipcs是Linux下显示进程间通信设施状态的工具。可以显示消息队列、共享内存和信号量的信息。对于程序员非常有用,普通的系统管理员一般用不到此指令。

ipcs shows information on the inter-process communication facilities for which the calling process has read access.By default it shows information about all three resources: shared memory segments, message queues, and sem......

使用cron进行调度

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。

通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

crontab文件

crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或......

readlink

readlink既是一个linux下的命令,又是Linux系统编程中的一个函数,因此本文分两部分介绍readlink.

readlink命令

readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。

在Ubuntu系统中执行以下命令:

$ readlink --help

可以查看readlink命令的帮助信息,或者执行

$ man readlink

查看帮助手册。

从帮助信息中可以得到readlink命令的用途描述:

输出符号链接值或者权威文件名

英文为:

print value of a symbol......

shell导入环境变量

看到一篇非常有意思的文章export variables,讲述了shell环境变量的用法,其中有一个比较新奇的点,例如我在命令行中直接输入bash可以创建一个新的实例(start a new shell instance).如果普通的变量定义在子进程中输出为空,如果想要将变量传递给子进程就需要export变量。

在stackoverflow看到一篇答案bash

The short answer is that when you type "bash" at a bash prompt, it starts a new bash process.

Bash is a program t......