Month: March 2013

单个线程也能造成死锁

APUE:如果线程试图对一个mutex加锁两次,那么它就会陷入死锁。 分析一下: 1. 第一次上锁成功后,获得锁 2. 第二次上锁时需要等待锁被本线程释放;而本线程目前已经在等待锁,无法释放第一次获得的锁;所以这个等待将是无限期的。 可重入锁(reentrant lock)就是用来避免这种情况发生的: 第二次上锁时不需要等待第一次上的锁被释放;java的ReentrantLock和synchronized关键字都使用了这种机制。 不过,Java里ReentractReadWriteLock在JDK 1.6 update 18 之前仍然可能造成单线程死锁: 拿到一个读锁,然后要求拿写锁。拿写锁时需要等待读锁被本线程释放(这里要拿的锁而已经锁上的锁是不同的,所以Reentrant不起作用),而本线程已经在等待写锁。无限循环的等待,造成死锁。这就是所谓的“读锁不可升级”

代码示例:unix环境下signal处理

无干货,仅用作demo #include <stdio.h> #include <signal.h> static void print_sig(int); int main(){ signal(SIGQUIT, print_sig); signal(SIGKILL, print_sig); while(1){ pause();//挂起以等待信号 } } static void print_sig(int signo){ printf("Signal Encountered: %d\n", signo); } 执行它,然后用另一个进程执行kill -3 pid,可以在控制台看到输出"Signal Encountered: 3"; 但如果kill -9 pid,则看不到任何输出,因为UNIX环境规定kill -9不准block.

想入门汇编语言可以看csapp第3章

想入门汇编语言可以看CSAPP(《深入理解计算机系统》)第二版第3章。 它一般先来一段C语言编译成目标代码,然后反汇编一下,再对照讲解C代码和反汇编出来的汇编代码,这样弄比较好理解。 附:UNIX环境中反汇编的命令是  objdump -d 可执行文件

代码示例:unix环境文件IO、出错处理

无干货,纯示例。 #include <fcntl.h> #include <stdio.h> int main(){ //先试着打开一个不存在的文件 char* filepath = "/home/kent/temp/test-file-io.txt"; int fd = open(filepath, O_RDWR); printf("The File Descriptor of an non-existing files is %d \n", fd); if(fd == -1){ perror(filepath); } //创建文件 fd = open(filepath, O_CREAT|O_RDWR, 0777); printf("The new created File Descriptor is %d \n", fd); //当前偏移量 int pos = lseek(fd, 0, SEEK_CUR); …

代码示例:unix环境文件IO、出错处理 Read More »

unix代码示例:一个socket客户端程序

代码:模仿telnet访问newsmth bbs,打印第一次收到的应答后即退出。 #include <stdio.h> #include <unistd.h> #include <netdb.h> #include <errno.h> #include <sys/socket.h> #include <string.h> #define MAXADDRLEN 256 #define BUFLEN 500 void print_resp(int sockfd) { printf("ready to print response\n"); char buf[BUFLEN]; int n; int i; for(i = 0; i < 5; i ++){ n = recv(sockfd, buf, BUFLEN, 0); write(STDOUT_FILENO, buf, n); } } int main(int …

unix代码示例:一个socket客户端程序 Read More »

unix环境:exec()会替换进程中的哪些东西?

exec()会替换进程中的哪些东西? 1. text段 2. 数据段 3. 堆 4. 栈 原来的文件描述符是否会被关闭? 这取决于文件描述符是否有设置了close-on-exec标志。如果设置了,在exec时就会关闭。默认情况下没有这个设置,因此exec时默认不会关闭原来的文件描述符。

代码示例:linux多线程

#include <stdio.h> #include <pthread.h> #include <sys/syscall.h> int gettid(){ return syscall(SYS_gettid); } void print_pid_tid(){ printf("Current pid is %u and current tid(lwp_id) is %u\n", (unsigned int)getpid(), (unsigned int)gettid()); } void * thread_func(){ printf("Created thread: "); print_pid_tid(); } int main(){ pthread_t thread; int err = pthread_create(&thread, NULL, thread_func, NULL); //第3个参数是一个函数,相当于java Runnable类里的run方法 if(err != 0){ perror("Cannot create thread"); } …

代码示例:linux多线程 Read More »