Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990059
  • 博文数量: 102
  • 博客积分: 10120
  • 博客等级: 上将
  • 技术积分: 2754
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-13 23:00
文章分类

全部博文(102)

文章存档

2011年(6)

2010年(55)

2009年(16)

2008年(25)

分类: LINUX

2009-04-06 01:30:00

  • uclinux不支持fork()!但是支持vfork()和clone()系统调用。因此猜测对pthread的支持是没有问题的,因为pthreads依靠clone()系统调用。
  • 当使用vfork()创建子进程时,在创建的子进程中不能做任何修改变量的操作(无论是全局变量还是局部变量),因为此时父进程和子进程共享同一 地址空 间,子进程若修改变量,实际修改的是父进程的地址空间中的变量,也就是改变了父进程的状态,由此导致的结果是未定义的。[APUE对此也有说明,并解释了 为什么在vfork()创建的子进程中只能调用_exit()而不能调用exit()的原因]
  • 在编写shell脚本时,赋值号两边不能有空格。比如:

TEMPFILE=.tempfile

是正确的;但是这样写:

TEMPFILE = .tempfile

就是错误的。

  • 关于计量单位,毫是milli,微是micro,切勿再混淆。
  • vim可以编程,其相关说明见:help eval,vim的表达式语法和内建的命令在这部分中有说明。
  • vim的zt,zz,zb三个命令可以把当前行变为所在窗口的最顶行、中间行、最底行,当熟练运用。另,[[,]],][,[]四个命令可以用来前进(后退)到下一个(上一个)位于第一列的{或者},非常适合于查看C源程序的所时候使用,当熟用。
  • Linux下的一些截图工具:

Gimp
gnome-screenshot
gnome-panel-screenshot
ImageMagick套件的import
xwd
这些工具中,Gimp功能强大,适合截图之后需要进行处理的场合;gnome系列的两款比较简易,适合要求不高的快速截图;ImageMagick套件的import非常适合在控制台下使用;xwd的优势是X-WINDOW自带,无需额外安装。

  • 当多个用户进程共享一片内存空间时,可以使用msync()系统调用来确保一致性。但是msync()能否保证cache一致性尚未可知。
  • uCLinux-bf561中spin_lock()的调用轨迹是:spin_lock()⇒_spin_lock() ⇒_raw_spin_lock()⇒__raw_spin_lock()⇒___raw_spin_lock_asm()。spinloct_t类型定 义如下:

typedef struct {
raw_spinlock_t raw_lock;
} spinlock_t;
其中raw_spinlock_t定义为:
typedef struct {
volatile int lock;
} raw_spinlock_t;
在上述调用轨迹中,___raw_spin_lock_asm()才会真正修改spinlock.raw_lock.lock。仅使用了 spinlock.raw_lock.lock的最低位来表示spinlock的状态,当spinlock.raw_lock.lock的最低位为1时, 表示已上锁,当spinlock.raw_lock.lock的最低位为0时,表示未上锁。在___raw_spin_lock_asm()中,测试和设 置spinlock.raw_lock.lock最低位的操作并不是原子操作,之所以能保证spinlock的原子性,是因为 ___raw_spin_lock_asm()调用了更低层次上的两个函数:_get_core_lock()和_put_core_lock()。这两 个函数操作一个定义在L2存储器中的变量corelock,corelock的类型为:
struct corelock_slot {
int lock;
};
函数_get_core_lock()在corelock上的操作是原子操作,因为它使用了Blackfin处理器的原子操作指令TESTSET来测试并设置corelock。
归纳起来,可以这样讲:spinlock可以用来保证操作的原子性,但是spinlock实际上是由更为底层的原子变量和原子指令保护的。

  • 在Unix下,*.ps类型的文件是postscript文件,主要用于打印输出,可以用ghostscript查看,ghostscript可 以将输出送往打印设备、显示设备或者文件。当想在X-Window下预览打印效果时可以将输出设备设置为x11,这将通过X-WINDOW窗口输出预览效 果,每页显示一次。指定输出设备的选项是-sDEVICE:

gs -sDEVICE=x11 yourpsfile.ps

  • 在shell编程时,需要注意变量的赋值与引用是不一样的。向一个变量复制时没有$前缀,但是引用变量的值时需要有$前缀,这和在命令行下设置和引用环境变量是一致的。比如,要向变量name赋值一个字符串”dummy test”,应该这样写:

name=”dummy test”

而当要引用变量name的值,比如用于字符串比较时,应该这样写:

if [[ $name == "stupid" ]]
then

fi

  • 在shell编程时,可用用$#取得命令行参数的个数,但是和C/Python等语言的概念不同,$#所表示的参数个数是不包括参数0的。也就是说,如果像下面这样执行一个shell脚本:

./some.sh x y whateverelse

那么,在some.sh中$#的值是3,而不是我们通常理解的4。

  • 如果一个shell脚本或者shell命令的某个参数含有空格之类的分割字符,那么,为了保证参数的正确传递,需要将参数用引号引起来。 shell提供了两种引号干这事:单引号和双引号。这两种引号的作用是不同的,主要的区别在于是否会执行展开(expansion):双引号括起来的参数 会执行展开,而单引号括起来的参数不会执行展开。比如,如果使用双引号:

echo “my home is $HOME”

执行的结果是:

my home is /root

因为$HOME展开成了我的家目录/root。而如果使用单引号:

echo ‘my home is $HOME’

执行的结果是:

my home is $HOME

因为单引号不作展开,因此会原样输出。

  • 在shell中执行算术运行时,要使用let命令,比如,如果要执行i++或者i=i+1之类的运算,就得使用let命令,像下面这样:

let i++
let i=i+1

断不可像系统级语言那样直接进行算术运算。

  • 关于shell中条件/循环语句的书写。当把条件/循环语句的各个子句写在多行上时,可以省略各个子句末尾的分号,但是当把条件/循环语句的各个子句写在同一行上时,就不能省略各个子句末尾的分号。比如,下面的多行while语句:

while [[ 1 ]]
do
echo ’shl’
sleep 1s
done

如果写成单行,必须加入分号分隔各个子句:

while [[ 1 ]] ; do echo “shl”; sleep 1s; done

不加分号的话shell会报syntax error错。

阅读(925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~