《Linux编程技术详解》杜华
1. 杂问
Q:GC/InfoServer在Win平台下似乎有很多日志在console输出,是否会成为潜在性能瓶颈? 2011/12/19
2.文件系统
* FHS and VFS
FHS:File Hirachy System
VFS:Virtual File System
* inode结构
分层指针结构:小于12个数据块的文件将有较高访问速度
3. 重定向dup?
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char **argv) {
int fd1, fd2;
if((fd1=open(argv[1], O_CREAT | O_RDWR, 0777)) == -1) {
perror("Cannot Create the file!");
return 1;
}
//close(STDOUT_FILENO);
if((fd2=dup(fd1))==-1) {
perror("Cannot reserve the std out fd!");
return 1;
}
printf("Write the file /n");
close(fd1);
return 0;
}
4. 虚拟内存系统
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 104 8572 64972 193908 0 0 12 7 90 183 1 4 95 0 0
buff:磁盘缓冲空间大小
cache:缓存空间大小
Q:不同的!
cs:Context Switch per second,到底是神马东东?
5. 进程内存结构
* 用户空间:低位3G,内核空间:高位1G
* 代码段,数据段,堆/栈段
6. 用户ID
UID
EUID ?
setuid()
[root@localhost ch07]# cat p7.3.setuid.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("UID: %ld/t EUID:%ld/n", getuid(), geteuid());
return 0;
}
7. 多进程 fork()/vfork()
[root@localhost ch07]# cat p7.7.vfork.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int g_var = 0;
int main() {
pid_t pid;
int var=1;
printf("Process id: %ld/n", getpid());
printf("Before fork() call, g_var=%d/, var=%d/n", g_var, var);
//if((pid=fork())<0) {
if((pid=vfork())<0) {
perror("Cannot create child process!");
return 1;
} else if(pid==0) {
g_var++;
var++;
printf("pid=%ld, g_var=%d/, var=%d/n", getpid(), g_var, var);
_exit(0);
} else {
printf("pid=%ld, g_var=%d/, var=%d/n",getpid(), g_var, var);
return 0;
}
}
[root@localhost ch07]# ./vfork
Process id: 32107
Before fork() call, g_var=0, var=1
pid=32108, g_var=1, var=2
pid=32107, g_var=0, var=1
注1:此程序改为vfork()后,可以发现子进程中的变量修改将影响父进程
注2:使用vfork()将阻塞父进程,直至子进程调用_exit()或exec(...)
注3:子进程不能使用return或exit
使用return,如下错误:
[root@localhost ch07]# ./vfork
Process id: 32192
Before fork() call, g_var=0, var=1
pid=32193, g_var=1, var=2
pid=32192, g_var=1, var=2227077
总线错误
使用exit,没有发现报错!
注4:fork()目前使用”写操作复制 COW Copy-On-Write),使vfork()用途不那么大了。
8. exec(...)
* 功能:使用新的进程image代替当前image,但process id不变
* 一个函数簇,主要区别在于“参数”与“路径”
l:参数列表出来
v:参数使用数组
p:程序若无path,将使用PATH环境变量
9. kill()
[root@localhost ch07]# cat p7.14.exit.c
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char **argv) {
pid_t pid;
int exit_code;
pid=getpid();
srand((unsigned)pid);
exit_code=(int)(rand()%256);
sleep(10);
if(atoi(*(argv+1))%2) {
printf("Child process id: %d receive signal SIGKILL/n", pid);
kill(pid, 9);
} else {
printf("Child process id: %d normally exit, exit_code is %0x/n", pid, exit_code);
exit(exit_code);
}
}
[root@localhost ch07]# cat p7.15.kill.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
pid_t pid, wait_pid;
int status;
int i;
for(i=1;i<4;i++) {
if((pid=fork())==0) {
execl("./exit", "exit", argv[i], NULL);
} else {
printf("create the child process id: %d/n", pid);
}
}
while((wait_pid=wait(&status)) && wait_pid!=-1) {
printf("process id:%d exit, exit code is %0x/n", wait_pid, status);
}
return 0;
}
Q:why没有kill的东东出来?
A:可能是因为随机数的选择参数不对
10. daemon
[root@localhost ch08]# cat p8.1.daemon.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int daemon(int nochdir, int noclose) {
pid_t pid;
pid=fork();
if(pid<0) {
perror("fork.");
return -1;
}
if(pid!=0) {
exit(0);
}
pid=setsid();
if(pid<-1) {
perror("setsid");
return -1;
}
if(!nochdir) {
chdir("/");
}
if(!noclose) {
int fd;
fd=open("/dev/null", O_RDWR, 0);
if(fd!=-1) {
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
}
}
umask(0027);
return 0;
}
int main() {
daemon(0,0);
sleep(1000);
return 0;
}