Linux6-进程消亡、

一、进程补充

函数指针取别名

typedef void (*tmp) vdoid;//将所有的void (*)void数据类型取别名为tmp

1.进程消亡:

        进程退出:

                1.1主函数调 return 0;

                1.2调 exit(库函数)\_exit\Exit(系统调用)(不会刷新缓冲区、因为文件io无缓冲区)

 void exit(int status)(会刷新缓冲区)
功能:退出一个进程

 参数:

  EXIT_SUCCESS  0一切成功退出   

   EXIT_FAILURE     1发生失败退出

                1.3被动结束,信号结束

        进程回收:

                 僵尸进程:进程已结束,但其资源空间未被其父进程回收

                 如何避免僵尸进程:

                1.子进程结束,其父进程使用wait/waitpid回收资源空间

                

pid_t wait( int *wstatus);
功能:回收子进程空间和退出状态(会有阻塞的效果,等待子进程结束)
参数:需要保存的回收的子进程状态值的地址
返回值:成功返回子进程的id号
pid_t waitpid( pid_ pid,int *wstatus,int options);
功能:回收子进程(会有阻塞的效果,等待子进程结束)和wait相似,比wait灵活

参数:pid

<-1回收指定进程组内的任意子进程(-100.等待GID=100的进程组中的任意子进程)

-1回收任意子进程,组内外
0回收和当前调用watpid一个组的所有子进程,组内

>0回收指定D的子进程

        status:

子进程退出时候的状态,如果不关注退出状态用NULL:

        options:

0表示回收过程会阻塞等待WNOHANG表示非阻塞模式回收资源。

返回值:成功返回接收资源的子进程pid
            失败 -1
设定为非阻塞且没有回收到子进程返回0

*使用非阻塞方式回收,需要加轮询方式可以让父进程执行自己的任务。

*wait主要做的资源回收就是回收内核中的PCB块

                2.让子进程成为一个孤儿进程,让孤儿进程会被系统中的进程收养,由系统进程负责回收。

                 孤儿进程:父进程先消亡,由该父进程产生的子进程变为孤儿进程被系统进程收养。

                什么叫守护进程?

        守护进程是在计算机系统启动时就已经运行,并且一直在后台运行的一类进程。它们独立于控制终端,通常不与用户直接交互,而是在后台执行某种任务或提供某种服务。

  1. 系统启动脚本:通过/etc/init.d/目录下的脚本启动和停止守护进程。这是传统的管理方式,但在现代Linux系统中逐渐被淘汰。
  2. systemd:现代Linux系统中使用的初始化系统和服务管理器,可以方便地启动、停止和管理守护进程。
  3. 进程管理工具:如supervisord等,可以监控和控制多个进程,包括守护进程。

 2.exec函数族( 不会创建一个新的进程,因为excel会将外部代码替换在当前文件中):

  • int execl(const char *path, const char *arg,.../*(char *)NULL */);        l:list:列表

              外部程序的路径如何执行这个代码……从NULL前结束    

例子:excel("hello","./hello",NULL);

           excel("/bin/ls","ls","-l",NULL);*whereis 可查看指令的目录

                      绝对路径


  • int execlp(const char *file, const char *arg, .../*(char *)NULL */);          p:PATH:环境变量中的路径  不可执行自己创建的文件 *env 可查看环境变量

例子: exclp("ls","ls","-l",NULL);*whereis 可查看指令的目录


  • int execv(const char *path, char *const argv[ ]);                                    v:vextor:容器

例子:char *s[]={"./app",NULL};

           execv("./app",s);

           char s[]={"ls","-l",NULL};

           execv("/bin/ls",s);


  • int execvp(const char *file, char *const argv[ ]):                                     p:PATH:环境变量中的路径

例子:char s[]={"ls","-l","-a",NULL};

           execvp("ls",s);*whereis 可查看指令的目录

                        任意文件,环境变量PATH保存了所有路径


  • int system(const char *commend)

例子:system("./a.out");

           system("ls -l -a");

  •  char *strtok(char *str,const char *delim );

功能:用来字符串的分割,会修改原字符串

例子:char s1[]={"ls -l -a"};

           char *p=strtok(s1," ");//p=ls

           char *p=strtok(NULL," ");//p=-l

           char *p=strtok(NULL," ");//p=-a

           char *p=strtok(NULL," ");//p=NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值