进程的总结
来源:互联网 发布:微信云控软件 编辑:程序博客网 时间:2024/05/22 01:50
进程
1、进程概念
进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。进程与程序、线程不同,进程和程序的区别在于进程是动态的,程序是静态的;进程是运行中的程序,程序是一些保存在硬盘上的可执行的代码。
2、进程标识
进程通过唯一的进程ID标识,它的ID是一个非负数。进程的一些其他信息可以通过相应函数来获得。
函数声明 功能
pid_getpid(id) 获得进程ID
pid_getppid(id) 获得进程父进程的ID
pid_getuid(id) 获得进程的实际用户ID
pid_geteuid(id) 获得进程的有效用户ID
pid_getgid(id) 获得进程的实际组ID
pid_getegid(id) 获得进程的有效组ID
3、LINUX进程的结构
linux中一个进程由代码段、数据段和堆栈段,代码段存放可执行代码,数据段存放程序的全局变量、常量、静态变量,堆栈段存放动态分配的内存变量,栈用于函数调用,存放函数的参数。函数内部定义的局部变量。
4、进程控制
fork:用于创建一个子进程
exit:用于终止进程
exec:用于执行一个应用程序
wait:将父进程挂起,等待子进程的终止
getpid:获取当前进程的进程ID
nice:改变进程的优先级
5、进程操作
<1>创建进程
主要通过fork函数来进行实现,vfork的原理上还是调用了fork函数。
fork1.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
pid_t pid;
printf("Process Creation Study\n");
pid = fork();
switch(pid)
{
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n",pid,getppid());
break;
case -1:
perror("Process creation failed\n");
break;
default:printf("Parent process is running,Child is %d,ParentPid is %d\n",pid,getpid());
break;
}
return 0;
}
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
pid_t pid;
printf("Process Creation Study\n");
pid = fork();
switch(pid)
{
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n",pid,getppid());
break;
case -1:
perror("Process creation failed\n");
break;
default:printf("Parent process is running,Child is %d,ParentPid is %d\n",pid,getpid());
break;
}
return 0;
}
fork2.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main (void)
{
pid_t pid;
char * msg;
int k;
printf("Process Creation Study\n");
pid = fork();
switch(pid)
{
case 0:
msg = "Child process is running";
k = 3;
break;
case -1:
perror("Process creation failed\n");
break;
default:
msg ="Parent process is running";
k = 5;
break;
}
while(k > 0)
{
puts(msg);
sleep(1);
k--;
}
return (0);
}
#include<sys/types.h>
#include<unistd.h>
int main (void)
{
pid_t pid;
char * msg;
int k;
printf("Process Creation Study\n");
pid = fork();
switch(pid)
{
case 0:
msg = "Child process is running";
k = 3;
break;
case -1:
perror("Process creation failed\n");
break;
default:
msg ="Parent process is running";
k = 5;
break;
}
while(k > 0)
{
puts(msg);
sleep(1);
k--;
}
return (0);
}
以下程序用来区分fork和vfork的区别
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/types.h>
#include<unistd.h>
int globVar = 5;
int main(void)
{
pid_t pid;
int var=1,i;
printf("fork is different with vfork\n");
pid=fork();
/*pid=vfork();*/
switch(pid)
{
case 0:
i = 3;
while(i-->0)
{
printf("Child process is running\n");
globVar++;
var++;
sleep(1);
}
printf("Child's globVar = %d,var = %d\n",globVar,var);
break;
case -1:
perror("Process creation failed\n");
return(0);
default:
i=5;
while(i-->0)
{
printf("Parent process is running\n");
globVar++;
var++;
sleep(1);
}
printf("Parent's globVar = %d,var = %d\n",globVar,var);
return(0);
}
}
<2>进程退出
(1)正常退出
在main函数中执行return
调用exit函数
调用_exit函数
(2)异常退出
调用about函数
进程收到某个信号,而该信号使程序终止
<3>执行新程序
main函数的完整原型为int main(int argc,char *argv[ ],char **envp);
下面程序是一个使用env命令查看环境变量值
env.c
#include<stdio.h>
#include<malloc.h>
extern char **environ;
int main(int argc,char *argv[])
{
int i;
printf("Argument:\n");
for(i=0;i<argc;i++)
{
printf("argv[%d] is %s\n",i,argv[i]);
}
printf("Environment:\n");
for(i=0;environ[i]!=NULL;i++)
printf("%s\n",environ[i]);
return 0;
}
#include<malloc.h>
extern char **environ;
int main(int argc,char *argv[])
{
int i;
printf("Argument:\n");
for(i=0;i<argc;i++)
{
printf("argv[%d] is %s\n",i,argv[i]);
}
printf("Environment:\n");
for(i=0;environ[i]!=NULL;i++)
printf("%s\n",environ[i]);
return 0;
}
<4> 等待进程结束
如果当子进程优先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵死状 态, 如果父进程调用了,就不会使子进程变成僵尸进程(没有释放所占的空间和内存)。
wait.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char *msg;
int k;
int exit_code;
printf("Study how to get exit code\n");
pid=fork();
switch(pid)
{
case 0:
msg = "child process is running";
k = 5;
exit_code = 37;
break;
case -1:
perror("Process creation failed\n");
exit(1);
default:
exit_code = 0;
break;
}
if(pid != 0)
{
int stat_val;
pid_t child_pid;
child_pid=wait(&stat_val);
printf("Child procee has exited,pid = %d\n",child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n",WEXITSTATUS(stat_val));
else
printf("Child exited abnormally\n");
}
else
{
while(k-->0)
{
puts(msg);
sleep(1);
}
}
exit(exit_code);
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char *msg;
int k;
int exit_code;
printf("Study how to get exit code\n");
pid=fork();
switch(pid)
{
case 0:
msg = "child process is running";
k = 5;
exit_code = 37;
break;
case -1:
perror("Process creation failed\n");
exit(1);
default:
exit_code = 0;
break;
}
if(pid != 0)
{
int stat_val;
pid_t child_pid;
child_pid=wait(&stat_val);
printf("Child procee has exited,pid = %d\n",child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n",WEXITSTATUS(stat_val));
else
printf("Child exited abnormally\n");
}
else
{
while(k-->0)
{
puts(msg);
sleep(1);
}
}
exit(exit_code);
}
6、进程的其他操作
<1>获得进程ID
系统调用getpid用来获得当前进程的ID。
getpid.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
if(pid = fork() == -1)
{
printf("fork error!\n");
exit(1);
}
if(pid == 0)
printf("getpid return %d\n",getpid());
exit(0);
}
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
if(pid = fork() == -1)
{
printf("fork error!\n");
exit(1);
}
if(pid == 0)
printf("getpid return %d\n",getpid());
exit(0);
}
<2>改变进程的优先级
通过系统调用nice可以改变进程的优先级。
mynice.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/resource.h>
#include<sys/wait.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int stat_val = 0;
int oldpri,newpri;
printf("nice study\n");
pid = fork();
switch(pid)
{
case 0:
printf("Child is running,CurPid is %d,ParentPid is %d\n",pid,getppid());
oldpri = getpriority(PRIO_PROCESS,0);
printf("Old priority = %d\n",oldpri);
newpri = nice(2);
printf("New priority = %d\n",newpri);
exit(0);
case -1:
perror("Process creation failed\n");
break;
default:
printf("Parent is running,ChildPid is %d,ParentPid is %d\n",pid,getpid());
break;
}
wait(&stat_val);
exit(0);
}
#include<sys/types.h>
#include<unistd.h>
#include<sys/resource.h>
#include<sys/wait.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int stat_val = 0;
int oldpri,newpri;
printf("nice study\n");
pid = fork();
switch(pid)
{
case 0:
printf("Child is running,CurPid is %d,ParentPid is %d\n",pid,getppid());
oldpri = getpriority(PRIO_PROCESS,0);
printf("Old priority = %d\n",oldpri);
newpri = nice(2);
printf("New priority = %d\n",newpri);
exit(0);
case -1:
perror("Process creation failed\n");
break;
default:
printf("Parent is running,ChildPid is %d,ParentPid is %d\n",pid,getpid());
break;
}
wait(&stat_val);
exit(0);
}
7、总结
通过对进程的学习更加深刻的了解进程的控制和使用方面的注意事项,也了解的进程的过程和在系统中进程主要依靠调用函数来实现自身的功能,相信对下一节线程的了解,将会有对进程和线程的关系的了解和更加深入了解进程的特点,它与程序、线程的不同之处。
0 0
- 进程使用的总结
- 进程的总结
- 进程管理的总结
- 进程学习总结之进程的基础知识和创建进程
- 对进程的学习总结
- 进程间通讯的总结
- 进程的相关知识总结
- 进程调度算法的总结
- 关于线程、进程的总结
- 守护进程的详细总结
- 内核总结之进程和进程的调度
- 孤儿进程与僵尸进程的实现与总结
- 进程总结
- 进程总结
- 进程总结
- 进程总结
- 进程总结
- 进程总结
- 第十二周项目3:日期时间类
- 指针变量作为函数参数
- poj 1014
- 项目配置p6spy打印ibatis的完整sql
- VC使用ADO访问sql server数据库
- 进程的总结
- java final的用法
- Eclipse 构建Maven项目详细流程(图文并茂)
- oracle 简答创建一个监听器记录对某张表的操作记录
- SQL 比较日期
- Searching: Fibonaccian Search-1: N+1 is a perfect Fibonacci number
- CentOS yum 源的配置与使用
- navicat 连接Oracle 报错:Cannot load OCI DLL, 126
- WinsockPragramming(1) Server(C++版)