免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 972 | 回复: 0
打印 上一主题 下一主题

[memo]近期笔记随录2009.04.06 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-06 01:30 |只看该作者 |倒序浏览
  • 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错。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/270/showart_1890857.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP