Linux C写中文配置

需要在linux C/C++程序中生成一个文件,文件中包含中文字符,可是上库到代码中编译运行,发现生成的文件乱码,相同的代码,自己编写的demo生成的文件显示却正常。

为什么会出现相同代码,运行结果不同的问题呢?

原因是由于项目文件中使用的是ISO 8859-1编码,而我自己编写的demo使用的是utf-8编码,而ISO 8859-1编码无法识别中文字符,因此导致写入到文件乱码。

我们使用如下代码验证:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <......

Linux进程间资源共享

周末整理笔记,发现已经有接近一年的笔记等待整理,主要是Linux进程间资源共享,包括变量、锁、函数,很多笔记中没有记录引用链接,这是个不好的习惯。

Linux内核中是不存在线程的概念的,一切可执行单元都是进程。所谓多线程,其实是一组可以共享内存的进程,即“轻量级进程”。所以应该只要实现内存共享,就能让进程之间互相访问。同一个进程的多个线程天然具有上面的特性。

变量共享

master.c

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <assert.......

rename 函数使用注意事项

看日志中的rename函数的一个报错信息:Invalid cross-device link,花几分钟google搜索之后确定不是问题,记录下相关排查和验证过程。

man手册里的资料:

EXDEV The links named by new and old are on different file systems and the implementation does not support links between file systems.

返回EXDEV这个错误码是由于old和new位于不同的文件系统。为了验证这一观点,我从床底下搬出了我的上古时期的笔记本,......

Linux性能优化实践

本文是学习极客时间《Linux性能优化实战》课程,针对课程中用到的一些命令的学习笔记。

课程信息

ps命令不加参数执行ps

[root ~]#ps

PID TTY TIME CMD

4273 pts/0 00:00:00 bash

9507 pts/0 00:00:00 ps

[root ~]#

结果默认会显示4列信息。

PID: 运行着的命令(CMD)的进程编号

TTY: 命令所运行的位置(终端)

TIME: 运行着的该命令所占用的CPU处理时间

CMD: 该进程所运行的命令

显示所有进程

ps -ax,命令结果可能很长,可以配合les......

系统程序员成长计划

线程参数共享的问题

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

#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;

......

C语言常用宏总结

获取数组长度

/// Obtain the number of elements in the given C array

#define GET_ARRAY_LEN( arrayName ) (sizeof( arrayName ) / sizeof(( arrayName)[ 0 ] ))

使用例子:

#include <stdio.h>

/// Obtain the number of elements in the given C array

#define GET_ARRAY_LEN( arrayName ) (sizeof( arrayName ) / ......

无锁队列

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

无锁队列的关键原理是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");

//......

void *的作用

在stackoverflow上看到一篇关于void *作用觉得非常不错,将作者的回答贴在下面,后续补充自己的理解。

A pointer to void is a "generic" pointer type. A void * can be converted to any other pointer type without an explicit cast. You cannot dereference a void * or do pointer arithmetic with it; you must convert it to a pointer to a......