linux 进程的创建 和退出回收

======================线程======================================

进程概念:创建的进程,进程的退出,进程的回收

进程:一个正在运行的程序就叫进程,进程是一个动态的概念 ,进程在内存中

可执行程序(ELF):静态的概念   (相当于保存在硬盘中)

进程:在linux中用一个结构体

struct task_struct

  {


}

引申:

struct abc

{

基本数据--》属性   成员变量

函数指针--》指向某种类型的函数成员的方法

};

来表征某个进程在运行的过程中所有的状态信息(进程id,父进程id)

孤儿进程:如果父进程没有主动的去回收子进程,那么子进程会变成孤儿进程,孤儿进程最终会被系统中一个叫做INIT的进程回收,init进程号是1,它是所有进程的祖先(组进程)

引用了进程的概念之后:意味着实现多任务的同时并发操作(同时处理多个任务)


相关的API函数

ps -ef查看系统中当前正在运行的进程信息

进程的创建(创建子进程)

fork();创建子进程的时候,子进程会复制父进程的所有资源

vfork();创建子进程的时候,子进程是共享他父进程的资源,一定是子进程先运行


API函数原形

         #include <unistd.h>  //包含的头文件

pid_t fork(void);

返回值:等于0       表示在子进程中

大于0       表示在父进程中

小于0        表示创建子进程失败

失败返回-1;


列子:

#include <stdio.h>
#include <unistd.h>


int main()
{
pid_t myid;

myid=fork();
if(myid==0)
{
printf("子进程\n");
}
else if(myid>0)
{
printf("父进程\n");
}
else if(myid<0)
{
printf("创建进程失败\n");
}

return 0;

}


打印出来的结果:


加延时的效果

#include <stdio.h>
#include <unistd.h>


int main()
{
pid_t myid;

myid=fork();
if(myid==0)
{
printf("子进程\n");
}
else if(myid>0)
{
sleep(1);
printf("父进程\n");

}
else if(myid<0)
{
printf("创建进程失败\n");
}

return 0;

}

显示出来的结果



(2)获取进程和父进程的ID号
     #include <unistd.h>
       pid_t getpid(void);  获取当前进程的ID
       pid_t getppid(void); 获取当前进程的父ID


打印出id号



=============================================================================

进程的退出

exit和_exit函数都是用来终止进程的。

exit()  退出的时候会刷新IO缓冲区

         _exit() 退出的时候不刷新IO缓冲区

         .exit是一个函数,有参数。exit执行完后把控制权交给系统

跟return之间的区别
               return 返回到调用它的函数
               exit   退出整个进程

例子:



return是语言级别的,不管你用不用都是存在的,它表示了调用堆栈的返回;而exit是操作系统中系统调用级别的,它表示了一个进程的结束。当然如果是mian函数中return(0)跟exit(0)是等效的


=============================================================================

进程的回收

回收子进程
         wait()
         waitpid()

pid_t wait(int *stat_loc);   阻塞父进程直到子进程退出然后回收子进程
            返回值:成功返回子进程的id
                    失败-1
              参数:stat_loc 保存子进程退出时的状态信息

//定义一个变量

int status;

wait(&status);   //回收子进程

if(WIFEXITED(status))//判断是否退出了



wait工作原理,

子进程结束后,系统向其父进程发送SIGCHILD信号,

父进程调用wait函数后阻塞,

父进程被sigchild信号唤醒然后去回收僵尸子进程,

若父进程没有子进程则wait函数返回错误,



几个宏用来获取子进程的退出状态。

WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)

WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)

WEXITSTATUS宏用来得到正常终止情况下的进程返回值的。



pid_t waitpid(pid_t pid, int *stat_loc, int options);
            它比wait要高级一点,因为它可以指定回收某个进程组里面的进程,也可以指定回收某个进程
            返回值:成功返回子进程的id
                    失败-1
              形参:pid   小于-1   比如-15  表示回收进程组id是15的那个进程组中的任意一个进程
                          -1       等待任意一个子进程
                          0        等待同进程组中任意一个子进程
                          >0       比如1245   指定回收id是1245的那个子进程
               












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值