Archive for ‘Unix/Linux’ Category

September 2, 2009
1
2
3
4
5
6
7
$ gcc test.cpp -otest
$ ./test&
$ 0x804a024
$ ./test&
$ 0x804a024
$ ./test&
$ 0x804a024

  对可执行文件test,不同的执行实例产生的输出为什么是一样的呢?为什么呢?难道一直以来我对虚拟地址空间的理解都是错误的?另外,如果int a是局部变量,输出就不同。

Tags: . 124 views
August 29, 2009

程序输出:
o.o.o.o.o.o.o.o..o.o.oo.o.o.o.o.o.o.o.o.21
为什么呢?
加上代码中注释掉的互斥锁1、2、3后,输出没有大的变化,只是global变成了20。再注释掉$1、#2,输出结果就正常了。

Tags: . 27 views
August 28, 2009

  管道是Linux支持的 IPC形式之一,具有以下特点:

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
  • 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
  • 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
Tags: ,,,. 55 views
August 26, 2009

实现了动态加载标准库中的数学函数库,输入函数名及参数,返回计算结果。

1
2
3
4
5
6
7
8
9
10
11
/*
 * #include <dlfcn.h>
 * void *dlopen( const char *file, int mode );
 * void *dlsym( void *restrict handle, const char *restrict name );
 * char *dlerror();
 * char *dlclose( void *handle );
 * dlopen	使对象文件可被程序访问
 * dlsym	获取执行了 dlopen 函数的对象文件中的符号的地址
 * dlerror	返回上一次出现错误的字符串错误
 * dlclose	关闭目标文件
 */
Tags: ,. 20 views
August 25, 2009
0x4000a963 <_dl_runtime_resolve+3>:     movl   0x10(%esp,1),%edx
0x4000a967 <_dl_runtime_resolve+7>:     movl   0xc(%esp,1),%eax
0x4000a96b <_dl_runtime_resolve+11>:    call   0x4000a740 

  指令xchgl %eax,(%esp,1)将printf的地址放入栈顶。最精彩的一条指令当属ret $0×8,它将栈顶元素即printf的地址弹出至程序计数器PC,作为下一条将执行的指令地址,同时,清除堆栈中的0×10和0×8049560。此时堆栈中的情形,就如同直接调用了printf函数,似乎什么都没发生过。

  此外还做了一件重要的工作,就是把前面提到的addr2替换为printf的地址。从而当再次调用printf时jmp *addr1就直接将程序定位到printf,不需要再次加载库libc.so了。

  不知道我说清楚了没有,感觉说的很乱,文字也很乱。:-)

Tags: ,,. 311 views
August 24, 2009

convert是imagemagick软件包中的一个命令。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。这里介绍几个简单的命令,具体的用法请参考man手册或者其官方网站。在Ubuntu中用命令

1
sudo apt-get install imagemagick

来安装,windows下的使用可以到官方网站下载。

Tags: ,,,. 527 views
August 23, 2009
生产者-消费者问题:

生产者-消费者问题是经典的同步问题,它描述一组生产者进程(线程)向一组消费者进程(线程)提供消息。它们共享一个有界的缓冲池,生产者向其中投放消息,消费者从中取得消息。生产者-消费者问题是许多具体问题中进程(线程)合作的一个很好的抽象。假定缓冲区中有N个位置,每个位置存放一个消息。当缓冲区未满时,生产者可以投入一个消息,否则该进程(线程)阻塞,直到缓冲区内有空位可放;当缓冲区非空时,消费者可以从中取得一个消息,否则该进程(线程)阻塞,直到缓冲区内有消息可取。

为了模拟这一过程,首先需要设置一个大小为N的缓冲区。修改缓冲区时,需要同步各个进程(线程)以免发生错误(向满的缓冲区投放消息或者从空缓冲区内取出消息)。为此,需要设置两个信号量empty和full用以标识缓冲区中空位数和消息数。另外还需要一个互斥锁mutex以互斥地修改缓冲区。为了便于测试,这里缓冲区的大小设置为5,实际情况下,应该尽量大些,以免生产者和消费者相互等待。

Tags: ,,. 279 views
August 22, 2009
  1. 减少pthread_cond_signal和sem_post的调用,只在有必要的时候调用;
  2. 尽量避免pthread_mutex进入竞争态。增大消息队列的大小,可以有效减少竞态条件的出现。

/*
* 此处循环判断的原因如下:假设2个线程在getq阻塞,然后两者都被激活,
* 而其中一个线程运行比较块,快速消耗了2个数据,
* 另一个线程醒来的时候已经没有新数据可以消耗了。
* 另一点,man pthread_cond_wait可以看到,
* 该函数可以被信号中断返回,此时返回EINTR。
* 为避免以上任何一点,都必须醒来后再次判断睡眠条件。
* 更正:pthread_cond_wait是信号安全的系统调用,不会被信号中断。
*/

Tags: ,,. 148 views

默认情况下,ubuntu终端的复制、粘贴快捷键是Ctrl+P、Ctrl+V,但ctrl+C、Ctrl+V已经习惯了,总是需要重新设置一下。这在9.04以前一直没出过什么问题,复制和中断程序也没有发生冲突。但9.04就不行了,想终止程序时Ctrl+C一点反应都没有,想必是按键冲突了吧,但平时也懒得去改,今天调的一个程序里面用到了条件变量和互斥锁(mutex),总是发生死锁,只好现Ctrl+Z暂停到后台,然后再kill %1才能将其终止。到后来实在忍不了了!stty -a查看了一下,和^C关联是intr,stty intr ^X把终止键绑定到Ctrl+X上了,剪切是很少用的。

Tags: ,. 119 views
August 3, 2009

看了Linux内核代码linux/string.h中的一些字符串操作函数,有几个写的真是漂亮!

char * strstr(const char*, const char*)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * strstr - Find the first substring in a %NUL terminated string
 * @s1: The string to be searched
 * @s2: The string to search for
 */
char *strstr(const char *s1, const char *s2)
{
	int l1, l2;
 
	l2 = strlen(s2);
	if (!l2)
		return (char *)s1;
	l1 = strlen(s1);
	while (l1 >= l2) {
		l1--;
		if (!memcmp(s1, s2, l2))
			return (char *)s1;
		s1++;
	}
	return NULL;
}
Tags: ,. 40 views
Page 5 of 9123456789