信号

整理书中的关于信号的例子,总结相关用法与误区。

信号是发生某种事件的通知机制,可以由内核、另一进程或进程自身发送给进程。存在一系列的标准信号类型,每种都有唯一的编号和目的。

信号传递通常是异步行为,这意味着信号中断进程执行的位置是不可预知的。默认情况下,要么忽略信号,要么终止进程,要么停止一个正在运行的进程。要么重启一个已停止的进程。特定的默认类型取决于信号类型。程序可以通过signal sigaction函数来显示忽略一个信号,或者建立一个由程序员自定义的信号处理器程序,以提供信号到达时调用。出于移植性考虑最好使用sigaction函数来建立信号处理函数。

一个具有相应权限的进程可以使......

从无锁锁说起

多线程编程中经常用锁来控制对全局变量的访问。多线程编程中必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。下面是一个例子:

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

int sum = 0;

void* adder(void *p)

{

for(int i = 0; i < 100000; i++) // 十万

{

sum++;

}

return NULL;

}

int main()

{

pthread_t threads[10......

网络编程-简单服务器客户端实现

刷微博看到有人推荐了一篇国外讲网络编程的文章,有时间学习了下,现将部分内容整理如下已备复习查阅。

服务端:

server.c

/*

** server.c -- a stream socket server demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h&......

网络编程-inet_pton和inet_ntop函数

最近解决了一个bug,是由于之前同事对于inet_ntop和inet_pton函数的理解存在问题,因此结合网络编程卷一书中的内容,将此部分内容总结记录。

函数原形:

#include <arpa/inet.h>

int inet_pton(int af, const char *src, void *dst);

const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

首先指出的是这两个函数是随IPv6出现的新函数,对于IPv4和IPv6都适用。函数名中的p和n分别代表表达(pr......

vfork挂掉的一个问题

原文链接

有如下代码:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int glob = 10;

int main(void)

{

int var;

var = 88;

pid_t pid;

if ((pid = vfork()) < 0)

{

printf("vfork error");

exit(-1);

}else if (pid == 0)

{ /* 子进程 */

var++;

return 0;

}

printf("pid=%......

linux c如何计算文件大小

最近在翻apue,看到函数lseek时想到之前一个面试题,如何计算文件的大小,现将部分实现整理如下:

方法一标准库函数实现:

#include <stdio.h>

#include <string.h>

#include <errno.h>

int main(int argc,char *argv[])

{

FILE *fp;

if(argc < 2)

{

printf("Usage:%s <file>\n",argv[0]);

}

if((fp=fopen(argv[1],"r")) ==......

系统调用与标准IO

最近抽时间在同事推荐的一本某培训机构出的一本书,虽然我对这种机构不感冒,不过坦率的讲,书中所总结的大都是比较重要的。

C标准库中许多函数构建于系统调用之上。比如库函数fopen()就是利用系统调用open()来执行打开文件的实际操作。printf()函数就是利用系统调用write()来执行。让我们来验证上述观点。

验证上述观点前需要熟悉strace命令,strace常用来跟踪进程执行时的系统调用和所接收的信号。来自man手册的介绍:

In the simplest case strace runs the specified command until it exits. I......

XY问题

最近在朋友圈看到的一篇文章,深有体会,问问题也是一门学问,转载自coolshell,改正原文中存在的一个错误。

对于X-Y Problem的意思如下:

1)有人想解决问题X

2)他觉得Y可能是解决X问题的方法

3)但是他不知道Y应该怎么做

4)于是他去问别人Y应该怎么做?

简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。于是乎:

1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。

2)在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的问题X是怎么一回事。

3)于是大家都发现,Y根本就不是用来解......

为用户编程:终端控制和信号

终端驱动程序的模式

以一个简短的例子作为开始:

/* rotate.c : map a->b, b->c, .. z->a

* purpose: useful for showing tty modes

*/

#include <stdio.h>

#include <ctype.h>

int main()

{

int c;

while ( ( c=getchar() ) != EOF ){

if ( c == 'z' )

c = 'a';

else if (islower(c))

c++;

pu......

连接控制:学习stty

终端是人们用来和Unix进程进行通信的设备。终端拥有一个可以让进程读取字符的键盘和可让进程发送字符的显示器。终端是一个设备,所以它在目录树中表现为一个特殊的文件,通常在/dev这个目录中。

进程和终端间的数据传输和数据处理由终端驱动程序负责,终端驱动程序时内核的一部分。该内核代码提供缓冲、编辑、和数据转换。程序可以通过tcgetattr和tcsetattr查看和修改驱动程序的设置。

tty也是一个Unix/Linux命令,用来给出当前终端设备的名称。stty命令让用户读取和修改终端驱动程序的位置。

终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

每个加载到......