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

来源:互联网 发布:怎么查淘宝热卖数据 编辑:程序博客网 时间:2024/05/19 11:49

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

一、进程操作

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 0
原创粉丝点击