进程基础-进程的创建、管理与调度、终止

进程有三种状态:就绪、执行、阻塞。

一、进程操作

1、进程的创建

程序可通过getpid()函数获取自身所运行的进程的ID,也可以通过getppid()获取父进程ID。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//printf("test\n");
printf("getpid:%d\n",(int)getpid());
printf("getppid:%d\n",(int)getppid());
return 0;
}

进程的创建有system()和fork()函数。

函数原型:pid_t fork()

一个进程通过调用fork会创建一个被称为子进程的副本进程,这个子进程和父进程不同的地方只有进程的ID,其他都是一样的,因此要保存这个子进程的ID。子进程创建后,父子进程一起从调用fork()函数的地方继续执行,竞争系统资源。

若创建失败,则fork返回-1;若子进程创建成功,则fork函数在子进程中返回0,在父进程中返回子进程ID.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t child_pid;
child_pid = fork();
if(child_pid > 0)
printf("father id:%d,child id:%d\n",getpid(),child_pid);
else if(child_pid == 0)
printf("child id :%d\n", getpid());
else 
printf("create process failed\n");
return 0;
}

运行结果:

father id:2899,child id:2900

child id :2900

2、进程的管理与调度

linux内核有一个进程控制表(Process Table),此表中的每一项都是一个task_struct结构,即代表一个进程。task_struct结构中有对应进程的优先级字段,进度调度器根据优先级的值,选择最迫切需要运行的就行进程来执行。

管理最好的办法是命令:(1)ps -aux


3、进程的终止

子进程一经创建,即与父进程一起被系统调度。子进程运行完毕后,并不立即释放所占用的进程控制表项,而是作为前面提到的僵进程存在与系统中。直至父进程正常退出或调用wait函数,子进程才彻底终止。


pid_t wait(int *status)


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t child_pid, pid;
child_pid = fork();
int status = 0;
if(child_pid > 0){
printf("father id:%d,child id:%d\n",getpid(),child_pid);
pid = wait(&status);
printf("child process finished pid:%d\n",child_pid);

}
else if(child_pid == 0)
printf("child id :%d\n", getpid());
else 
printf("create process failed\n");
return 0;
}

运行结果:

father id:3486,child id:3487
child id :3487
child process finished pid:3487


调用了wait函数的父进程会马上阻塞自己,由wait函数自动分析是否当前进程的某个子进程已经退出,如果找到了这样一个已经变成僵进程的子进程,wait函数就会搜集这个子进程的信息,将它彻底终止并返回子进程结束状态值;如果没有找到这样一个子进程,wait函数就会一直阻塞在这里,直到出现一个变成僵进程的子进程为止。

类似的还有 pid_t waitpid(pid_t pid, int *status, int options);


可以通过命令kill终止。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值