进程:正在运行的程序(分配资源:内存,CPU,IO等)
程序:有限指令的集合(静态:没有执行,存放在外存)
并发:多个任务“同时”执行。
(处理器某一时刻最多只运行一个进程)
1、进程:
进程描述符:代码进程的资源
struct task_struct
{
int pid;//代表进程的标识
};
1、获取进程PID:
int getpid();
获取父进程PID
int getppid();
2、创建子进程:
父子进程“并发”执行
int fork();
返回值:
在父进程中:返回子进程的pid号
在子进程中:返回0
失败:<0
PS:
1、父进程将自己的一切信息复制给子进程(包括数据区,代码区),也就是说子进程和父进程执行的代码是一样的。
2、但是空间不同。
3丶子进程和父进程一起从fork开始向下执行
3、等待子进程运行结束:
wait(int* status)
waitpid(int pid,int* status)
形参:
status:接收子进程的返回状态值,若为NULL值,不接收。
PS:若子进程运行不结束,就阻塞等待(子进程结束时,会向父进程发送一条信号),若子进程运行结束后,就会向父进程发送信号,调用进程收到信号后就退出等待。
PS:进程退出时会向父进程发送如下信息(信号,退出状态,其他信息)
[…][…][返回值][…]
宏:
WIFEXITED(status) 若通过exit/return/_exit退出时,值为1
WEXITSTATUS(status)取出返回状态。
4、进程退出:
正常退出:
1、main中遇到return int;
2、调用exit(int);
异常退出:
_exit(int)
运行错误
代码实现
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
int main()
{
//int pid=getpid();
//创建子进程
int pid=fork();
if(pid>0)
{
printf("我是父进程我的pid号是%d,我孩子的pid值为%d\n",getpid(),pid);
int s;
wait(&s);
printf("%d\n",s>>8);
}
else if(pid==0)
{
printf("我是子进程我的pid是%d,我的父进程趴pid是%d\n",getpid(),getppid());
return 3;
}
else
{
perror("filefail");
}
return 0;
}