复制代码

linux 大复习 进程1

进程 是系统分配资源 内存,时间片    的最小单元
         数据结构:PCB,代码段,数据段,堆栈段
         PCB: 进程控制块  pid 进程状态 优先级      进程动态优先级计数器 家族进程指针
进程调度算法 :  
            非抢占:FCFS    先来先用,排队思想 
            抢占 :  SJF       最短作业优先 谁快谁先干
                         HRRN  最高响应比优先法
             RR 时间片轮转算法
                     多级反馈队列 时间片轮换加优先级
进程状态 : 就绪        运行   阻塞  
                        调度/剥夺  io操作
 
进程  0 号进程 Linux内核 动态库 通过进程 
        1 号进程   init 第一个 用户进程      
创建父子进程
        1. 父亲死了,儿子被收养到特定进程 叫做孤儿进程或者守护进程
        2.儿子死了,父亲需要清理战场,父亲没有清理 就是僵尸进程
解决方式: 通过wait/waitpid 等待收尸,信号注册 
 
守护进程 daemon( ) //0 改变 1 不改变 
               具体做了什么 ,父进程搞死 子进程托孤儿给图形进程  
                改变路径 chdir 
               改变标准驶入输出错误 dup //dev/null
                                                                                   
 fork
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<unistd.h>
int main()
{

    pid_t pid =fork();
    if(pid == 0)
    {
        printf("the son: %d,the father pid : %d \n",getpid(),getppid());
//        while(1);
//        
    
//        printf("the son: %d,the father pid : %d \n",getpid(),getppid());
    }
    else if(pid >0)
    {
        
        printf("the father pid : %d \n",getpid());
        sleep(1);
//        pid_t wpid = wait(NULL);
        int state;
        pid_t wpid = waitpid(pid,&state,0);
        printf("      %d\n",wpid);
        exit(0);
    }
    else 
    {
        perror("fork errno");
        exit(0);
    }






    return 0;
}
View Code

vfork

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int mydaemon(int nochdir, int noclose);

int main(int argc, char *argv[])
{
    mydaemon(0,0);
    //man daemon 可以看到
    //0表示改变重定向   1表示不改变
    //daemon(1, 1);
    printf("test ...\n");
    for (;;) ;
    return 0;
}

int mydaemon(int nochdir, int noclose)
{
    pid_t pid;
    pid = fork();
    if (pid == -1)
        perror("fork error");

    if (pid > 0)
        exit(0);

    setsid();
    
    if (nochdir == 0)
        chdir("/");
    if (noclose == 0)
    {
        int i;
        for (i=0; i<3; ++i)
            close(i);
         //相当于把0号文件描述符之下/dev/null
        open("/dev/null", O_RDWR); //fd文件描述符fd-0的文件描述符指向  -16
        dup(0); //把0号文件描述符 赋值给空闲的文件描述符 1
        dup(0); //把0号文件描述符 赋值给空闲的文件描述符 2

    }

    return 0;
}
View Code

 

exec  替换进程印象
用一个进程拉起另一个进程 pid 保持不变 ,但是PCB 代码段,数据段,堆栈段进行替换
 
//存放的是环境变量
        extern char **environ;
 
       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
首先 第一个参数 是文件 程序 等,第二个 是执行的对应命令以及参数以NULL结尾,顺带着环境变量
exec
#include<stdio.h> 
#include <sys/types.h>
#include <unistd.h>

/*
  

       extern char **environ;

       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
       int execvpe(const char *file, char *const argv[],
                   char *const envp[]);

*/
 extern char **environ;

int main()
{
    
     printf("pid :: %d: \n",getpid());
    
    //找到进程 拉起来
 //    execl("/bin/ls","ls","-lt",NULL);
//    execlp("./exec","./exec",NULL);
    int i; 
    for(i=0;environ[i]!=NULL;i++)
    {
        printf("%s\n",environ[i]);
    }
    return 0;
}
View Code

hello

#include<stdio.h> 
#include <sys/types.h>
#include <unistd.h>


int main()
{
    
     printf("pid :: %d: \n",getpid());
    //execl("./exec","./exec",NULL);
    //execlp("./exec","./exec",NULL);
   char * const envp[] = {"aaa=111", "bbb=2222", NULL};
     
    execle("./exec", "./exec",NULL, envp);
    
    return 0;
}
View Code

 

 

 

 

 

 

 

 

 

 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2018-03-25 12:17  pg633  阅读(142)  评论(0编辑  收藏  举报