多进程线程:day3 复习:

多进程线程:day3 
        复习: 
            老>病>死> 收尸 
            
            进程替换:程序加载   在一个程序中载入另一个程序
            exec函数族
            #include <unistd.h>
       extern char **environ;

       int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */);
       int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);
       int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, 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[]);
            
        特点: 
            1>都是exec开头
            2>带l:参数以列表的方式传递 
            3>带v: 参数以数组的方式传递 
            4>带p: 需要去环境变量中寻找  默认去/bin 或 /usr/bin 去找 ---命令 
            5>带e:有新的数据需要传递到另外一方
            
        解析: 
            第一个参数:找到这个命令/文件
            后面:执行这个命令的语句,最终以NULL结尾 
            
        返回值: 
            EXEC只有出错时才返回,返回-1,并设置错误码
            
            
        锁:进程的锁  
            flock
            flock
            #include <sys/file.h>
            int flock(int fd, int operation);
            功能: 
                    给文件上锁
                    
            参数: 
                    fd:文件描述符 
                    operation:锁的属性 
                        LOCK_SH:共享锁 
                        LOCK_EX:互斥锁        
                        LOCK_UN:解锁                
                        LOCK_NB:不上锁 
            返回值: 
                    成功返回0 
                    失败返回-1,并设置错误码
                    
            锁作用:为了避免多个进程同时访问某临界资源,导致临界资源数据收损害 
                   所以出现一种手段可以让进程根据一定的顺序来进行临界资源访问
                                        ---->主要是为了保护临界资源
                                        
                                        
            进程的死亡: 
                exit   _exit   return 
                区别:eixt和_exit 
                exit在结束进程时会刷新缓冲区,将进程产生的缓冲区刷新 
                _exit在结束进程时直接结束,不会做任何其他的操作 
                
                return :结束函数,只能通过结束main函数,来达到结束进程的目的
                
                
                
            进程的收尸
                    收尸:释放某进程执行时所占的系统资源 
                    限制:收尸只能父进程给子进程收尸 
                    
                    wait  
                    #include <sys/types.h>
                    #include <sys/wait.h>
                    pid_t wait(int *wstatus);
                    功能: 
                            父进程给子进程收尸: 
                            阻塞等待子进程死亡后收尸
                            
                    参数: 
                            wstatus:子进程死亡状态 
                                    死亡信息,遗言 -->保存在次低位字节上
                                    
                    返回值: 
                            成功收尸:返回收到尸的子进程PID号
                            失败:返回-1,并设置错误码 
                            
                    1>wait 无法直接指定收尸 
                           只能通过操作子进程死亡顺序来改变收尸顺序 
                    
                    
                                        
                    waitpid 
                    #include <sys/types.h>
                    #include <sys/wait.h>
                pid_t waitpid(pid_t pid, int *wstatus, int options);
                功能: 
                        指定收尸 
                        父进程给子进程收尸: 
                        阻塞等待子进程死亡后收尸
                        
                参数: 
                        pid:
                            >0     >给特定子进程收尸  waitpid(2304,...,...);
                            =0    >给当前父进程同组的所有子进程收尸
                            =-1    >给任意子进程收尸,无论在哪
                            <-1    >给 进程组ID号为|PID| 下的子进程收尸   以组为单位 防止使用者整活
                            
                            
                        wstatus:子进程死亡状态 
                        
                        
                        options:属性选择 
                            0:阻塞等待收尸
                            WNOHANG:不阻塞 
                            WUNTRACED:死因调查
                                WIFEXITED(wstatus):判断子进程是否正常死亡  --- 死亡报告
                                     WEXITSTATUS(wstatus)----验尸 
                                     
                                WIFSIGNALED(wstatus):判断子进程是否被信号杀死 --- 死亡报告 
                                     WTERMSIG(wstatus)    ---验尸 
                                     
                                WIFSTOPPED(wstatus):判断子进程是否因为信号传递而被停止 ---死亡报告
                                       WSTOPSIG(wstatus)   ---验尸
         
                返回值: 
                        成功收尸返回收到尸的子进程PID号
                        非阻塞状态下:收到尸子进程PID号,没收到返回0 
                        失败返回-1,并设置错误码
=========================================================================================
        day3: 
            1>守护进程 
                什么是守护进程? 
                    后台进程
                    周期性在后台等待或运行某个任务 
                    类似木马/  常用协议:SMABA  nfs tftp 
                    
                    后台进程的特点: 
                        没有控制终端:不受终端影响 
                        没有输入输出:用不了printf scanf perror 
                        
                    制作守护进程的步骤: 7大步 
                        1>创建子进程,结束父进程 
                                        ----->为了会话做准备>组长无法成为会话
                        
                        2>设置当前子进程为一个会话/终端
                                        ----->为了摆脱原终端影响
                        
                        3>创建子进程,结束父进程 
                                        ----->彻底摆脱父子进程间的影响
                                    --------------守护进程雏形制作完毕
                        4>关闭所有文件描述符 
                        
                        5>改变执行目录
                        
                        6>修改权限掩码 
                        
                        7>文件描述符重定向 
                        
        守护进程API: 
            1>将某个进程设置为会话 
                setsid
                #include <sys/types.h>
                #include <unistd.h>
                pid_t setsid(void);
                功能: 将执行该函数的进程变成会话/终端 
                
                参数: 
                        void  :空
                        
                返回值: 
                        成功返回新的会话ID 
                        失败返回-1,并设置错误码
                
            2>找到某些东西的极限值->最大值 
            sysconf
            #include <unistd.h>
            long sysconf(int name);
            功能: 
                寻找极限值 
                
            参数: 
                    name:需要找的东西_SC_OPEN_MAX   --->找到最大的文件描述符
                    
            返回值: 
                成功返回最大值 
                失败返回-1,并设置错误码
                
            3>改变执行目录 
                chdir
                #include <unistd.h>
                int chdir(const char *path);
                功能: 
                        改变代码的执行目录
                        
                参数: 
                        path:需要修改到的目录 
                        
                返回值: 
                        成功返回0
                        失败返回-1,并设置错误码 
                        
            4>代码修改权限掩码 
                #include <sys/types.h>
                #include <sys/stat.h>
                mode_t umask(mode_t mask);
                功能: 
                        修改权限掩码 
                        
                参数: 
                        mask:掩码值 
                        
                返回值: 
                    总是会成功 
                    
            5>文件描述符重定向 
            #include <unistd.h>
            int dup(int oldfd);
            功能: 
                    文件描述符重定向
                    创建新的文件描述符,并和旧文件描述符实现重定向
                    
            参数: 
                    oldfd:旧的文件描述符--->已开启的文件描述符 
                    
            返回值: 
                成功返回新的文件描述符 
                失败返回-1,并设置错误码 
                
                
            int dup2(int oldfd, int newfd);
            功能:
                文件描述符重定向
                情况1:newfd没有分配。创建新的文件描述符,重定向与旧文件描述符
                情况1: newfd已经被分配,则让其失效,并让它重定向到旧文件描述符
            参数: 
                    oldfd:旧的文件描述符--->已开启的文件描述符 
                    newfd:新的文件描述符--->未开启和已开启
            返回值: 
                成功返回新的文件描述符 
                失败返回-1,并设置错误码
                
                
        文件日志系统 
                用来记录守护进程的操作 ,因为守护进程的特殊性:printf/scanf/perror无法使用
                
                linux的文件:EXT4:1>文件日志系统     ----  备份 
                                  2>时间回溯系统     ----  还原 
                                                        ---快照
                .swp文件:一般出现在:你编写某个文件时,遇到不正常退出后产生的临时缓存文件
                
        学习如何使用日志系统的API: 
                openlog 
                #include <syslog.h>
               void openlog(const char *ident, int option, int facility);
                功能:    
                        打开日志 
                        
                参数: 
                        ident:标签: 随便写
                        option:
                            LOG_PID   --->进程 
                            
                        facility: 记录什么信息
                            LOG_DAEMON  ---->守护进程 
                            
                                
                
                syslog  
                void syslog(int priority, const char *format, ...);
                功能: 
                        写日志 
                        
                参数: 
                        priority:报文 
                            LOG_ERR:错误报文 
                            LOG_WARNING:警告报文 
                            LOG_INFO:正常信息
                                
                        format:类似printf  
                        
                        ...:printf用的参数 
                        
                
                        
                        
                closelog 
                void closelog(void);
                功能L
                        关闭日志 
                        
                参数: 
                        void :空
    =====================================
    查看日志 
        sudo vim /var/log/syslog
                

===============================================================================================
    进程间通信: 
        早期 : 无名管道    有名管道    信号 
        系统V: 共享内存   信号量   消息队列
        
        网络编程:域通信
        
        
        1>无名管道 
            用于父子/具有血缘关系进程间通信 
            血缘关系:同一程序中开展出来的进程 
            
            pipe 
             #include <unistd.h>
            int pipe(int pipefd[2]);
            功能: 
                    无名管道 
                    
            参数: 
                    pipefd[2];--->文件描述符 
                            [0]--->读 
                            [1]--->写
                            
            返回值:l
                    成功返回0
                    失败返回-1,并设置错误码


        2>有名管道  :p文件
            mkfifo
            #include <sys/types.h>
            #include <sys/stat.h>
            int mkfifo(const char *pathname, mode_t mode);
            功能: 
                    创建有名管道 
                    
            参数: 
                    pathname:有名管道的名称 
                    mode:创建有名管道的权限 0666
                    
            返回值: 
                    成功返回0 
                    失败返回-1,并设置错误码
                    
                    
prw-rw-r-- 1 farsight farsight    0 5月  24 15:56 junshao   ----管道文件
        由内核映射上来的,映射管道文件  大小永远为->0
        
        #include <unistd.h>
        int access(const char *pathname, int mode);
        功能: 
                判断文件状态 
                
        参数: 
                pathname:文件名称 
                mode:
                    F_OK:文件存在
                    R_OK:文件可读 
                    W_OK:文件可写
                    X_OK:文件可执行 
                    
        返回值: 
                成功返回0 
                失败返回-1,并设置错误码
======================================================================================================
        信号
            是一种异步通知 由 内核发起 
        kill命令-->发送信号 默认功能为结束进程
        kill函数-->发送信号 没有默认功能,必须指定信号
        kill -l 查看kill的信号
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    
            
        函数: 
            kill--->发送信号 
            #include <sys/types.h>
            #include <signal.h>
            int kill(pid_t pid, int sig);
            功能: 
                    发送信号 
                    
            参数: 
                    PID:给谁发 
                    sig:信号 
                    
            返回值: 
                成功返回0 
                失败返回-1,并设置错误码


            atoi
             #include <stdlib.h>
            int atoi(const char *nptr);
            功能: 
                    将字符串转化为整型
                    
            参数: 
                    nptr:字符串 
                    
            返回值: 
                    成功返回整型 
                    失败返回-1,并设置错误码
                    
            信号注册 
            signal
            #include <signal.h>
            typedef void (*sighandler_t)(int);
            sighandler_t signal(int signum, sighandler_t handler);
            功能: 
                    信号注册 
                    
            参数: 
                    signum:信号 
                     handler:事件 
                            SIG_IGN:忽略 
                            SIG_DFL:默认 
                            信号捕捉:执行某一个自己写的函数  void (*)(int)
            
            返回值 
                    成功返回 sighandler_t
                    失败返回SIG_ERR,并设置错误码
                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值