读书时间 05/28/2011 Linux编程技术详解

14 篇文章 0 订阅

《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;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值