【原创】UNIX上文件记录锁的测试
在UNIX上一般的文件操作不含有记录锁,如果多个进程同时修改某个文件,往往是最后保存的进程替换掉先前保存的线程。但是这类I/O操作根本不适应数据库管理系统的多进程同时写操作,数据库操作要求多个进程能够利用记录锁的机制对文件的某一部分进行锁定。系统调用fcntl 就提供了这种方法,以下是实验结果:[@more@]源代码:#include <stdio.h>#include <fcntl.h>#include <sys/wait.h>#include <errno.h>int main(){ struct flock lock; int fd,pid; lock.l_type=F_WRLCK; lock.l_start=0; lock.l_
【原创】sigaction() 解决了在某些平台上需要再度安装信号的问题
一旦对给定的信号采取sigaction() 设置了捕捉动作,那么在再次调用sigaction() 显式改变它之前处理方式一直有效。这种处理方式和signal() 在某些平台上的不可靠机制不同,符合了posix.1 标准。测验如下:[@more@]改用sigaction 后发现即使是在AIX上也解决了signal函数可能存在需要再次安装信号的不可靠问题源代码:#include <stdio.h>#include <signal.h>#include <stdlib.h>int main(){ void my_alarm(int); struct sigaction act,oact; act.sa_handler=my_alarm; sigemptyset(&act.sa_mask); si
【原创】setjmp 和 longjmp 用于信号处理的研究
对于那些在执行完信号处理函数之后自动重启系统调用的应用平台例如FreeBSD 6.2 等来说可以用 setjmp 和 longjmp 这一对函数来实现程序的中止。例如:[@more@]#include <stdio.h>#include <signal.h>#include <unistd.h>#include <setjmp.h>static void sig_alrm(int);static jmp_buf env_alrm;int main(){ int n=-10; char line[1024]; if(signal(SIGALRM,sig_alrm)==SIG_ERR) { printf("nError in signal!n"); fflush(stdout); return 1; } if(setjmp(
【原创】编写守护进程程序中对信号进行安装在不同平台上的差异
现代的AIX或者Linux系统上的守护进程中如果在主函数中定义了信号安装之后,是否仍存在以往那种一旦信号执行程序被触及那么信号必须马上再次被安装否则进程对于该信号的处理方式将被进程设置为默认处理的问题呢?[@more@]也就是说:main(){ ... signal(SIG****, handle ); ...}handle (){ signal(SIG****, handle ); ----------- 这一行是否还有必要再写?? ....}我们先在FreeBSD上做实验:#include <stdio.h>#include <signal.h>#include <string.h>#include <pwd.h>#include <s
【原创】标准I/O库函数的缓冲机制引发的问题
标准I/O库函数在应用层提供了缓冲机制,这点不同于系统调用函数。一般对于交互界面是行缓冲,对于文件是全缓冲。这两种缓冲机制的差别可以通过一个小例子进行观察。[@more@]源代码:#include <stdio.h>#include <unistd.h>int main(){ int i=10,pid; printf("nBefor fork.n"); fflush(stdout); if((pid=fork())<0) { printf("nError fork!"); return 1; } else if(pid==0) i++; else sleep(2); printf("ni=%dn",i); return 0;
【原创】设置进程环境变量函数 putenv() 和 setenv() 的区别
putenv() 函数并不copy环境变量数值到进程环境表,只是存放环境变量数值的指针,而setenv()函数则完全copy环境变量数值到进程环境表。实验如下:[@more@]第一:在main函数中调用putenv(),设置进程环境变量源代码:#include <stdio.h>#include <stdlib.h>extern char **environ;void setfun(void);int main(){ int i=0; char tt[]="ORACLE_SID=test"; while(environ[i]!=NULL) { printf("n%s",environ[i]); i++; } printf("nn"); if(putenv(tt)!=0) {
【原创】O_SYNC 同步标志导致的I/O速度的巨大差异
myscp 程序 中open系统调用指定了 O_SYNC 标志位 [@more@]open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_SYNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 用myscp 拷贝600M左右的程序所花的时间:[root@fsever FreeBSD]# du -m ./*25 ./6.2-RELEASE-i386-bootonly.iso574 ./6.2-RELEASE-i386-disc1.iso640 ./6.2-RELEASE-i386-disc2.iso189 ./6.2-RELEASE-i386-docs.iso[root@fsever FreeBSD]# time myscp ./6.2-RELEASE-i386-disc1.iso ./test.isoreal 13m21.320suser 0m0.184ssys 0m5.936s[root@fsever FreeBSD]# mycp 程序中open 系统调用没有指定O
【好文转载】/etc/fstab释疑
1、fstab文件的作用 文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。 [@more@]2. fstab文件格式 下面是/etc/fatab文件的一个示例行: fs_spec fs_file fs_type fs_options fs_dump fs_pass /dev/hda1 / ext2 defaults 1 1 fs_spec - 该字段定义