1 2 3 4 5 6 7 | $ gcc test.cpp -otest $ ./test& $ 0x804a024 $ ./test& $ 0x804a024 $ ./test& $ 0x804a024 |
对可执行文件test,不同的执行实例产生的输出为什么是一样的呢?为什么呢?难道一直以来我对虚拟地址空间的理解都是错误的?另外,如果int a是局部变量,输出就不同。
熟读而精思,循序而渐进,厚积而薄发。
1 2 3 4 5 6 7 | $ gcc test.cpp -otest $ ./test& $ 0x804a024 $ ./test& $ 0x804a024 $ ./test& $ 0x804a024 |
对可执行文件test,不同的执行实例产生的输出为什么是一样的呢?为什么呢?难道一直以来我对虚拟地址空间的理解都是错误的?另外,如果int a是局部变量,输出就不同。
程序输出:
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,输出结果就正常了。
管道是Linux支持的 IPC形式之一,具有以下特点:
实现了动态加载标准库中的数学函数库,输入函数名及参数,返回计算结果。
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 关闭目标文件
*/ |
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函数,似乎什么都没发生过。
此外
不知道我说清楚了没有,感觉说的很乱,文字也很乱。:-)
convert是imagemagick软件包中的一个命令。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。这里介绍几个简单的命令,具体的用法请参考man手册或者其官方网站。在Ubuntu中用命令
1 | sudo apt-get install imagemagick |
来安装,windows下的使用可以到官方网站下载。
生产者-消费者问题是经典的同步问题,它描述一组生产者进程(线程)向一组消费者进程(线程)提供消息。它们共享一个有界的缓冲池,生产者向其中投放消息,消费者从中取得消息。生产者-消费者问题是许多具体问题中进程(线程)合作的一个很好的抽象。假定缓冲区中有N个位置,每个位置存放一个消息。当缓冲区未满时,生产者可以投入一个消息,否则该进程(线程)阻塞,直到缓冲区内有空位可放;当缓冲区非空时,消费者可以从中取得一个消息,否则该进程(线程)阻塞,直到缓冲区内有消息可取。
为了模拟这一过程,首先需要设置一个大小为N的缓冲区。修改缓冲区时,需要同步各个进程(线程)以免发生错误(向满的缓冲区投放消息或者从空缓冲区内取出消息)。为此,需要设置两个信号量empty和full用以标识缓冲区中空位数和消息数。另外还需要一个互斥锁mutex以互斥地修改缓冲区。为了便于测试,这里缓冲区的大小设置为5,实际情况下,应该尽量大些,以免生产者和消费者相互等待。
/*
* 此处循环判断的原因如下:假设2个线程在getq阻塞,然后两者都被激活,
* 而其中一个线程运行比较块,快速消耗了2个数据,
* 另一个线程醒来的时候已经没有新数据可以消耗了。
* 另一点,man pthread_cond_wait可以看到,
* 该函数可以被信号中断返回,此时返回EINTR。
* 为避免以上任何一点,都必须醒来后再次判断睡眠条件。
* 更正:pthread_cond_wait是信号安全的系统调用,不会被信号中断。
*/
默认情况下,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上了,剪切是很少用的。
看了Linux内核代码linux/string.h中的一些字符串操作函数,有几个写的真是漂亮!
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; } |