每个进程都有一个唯一的正数 进程ID getpid函数返回调用进程的PID getppid函数返回他的父进程的PID.
#import <stdio.h>
#include <zconf.h>
int main(int argc, char **argv){
fprintf(stdout,"%d\n",getpid());
fprintf(stdout,"%d\n",getppid());
return 0;
}
进程总是三种状态
1.运行
2. 停止
3.终止
exit 函数以status推出状态来终止进程(另一种设置退出状态的方法是从主程序中返回一个整数)
#include <cstdlib>
int main(int argc, char **argv){
exit(0);
return 0;
}
父进程通过fork函数来创建一个新的子进程
pid_t fork(void) 在父进程返回子进程的PID 子进程返回0 出错返回-1
#include <zconf.h>
#import <stdio.h>
int main(int argc, char **argv){
if(fork()==0){
printf("this fork\n");
}
printf("end \n");
return 0;
}
子进程的到与父进程用户级虚拟地址空间相同的一分拷贝,共享父进程打开的文件描述符。
区别是他们的 PID不同,fork()函数只会拷贝调用前的数据,之后的不受干涉
1. 调用一次,返回两次。
2. 并发执行。
3.相同的但是独立的地址空间
4.共享文件
#include <zconf.h>
#import <stdio.h>
#include <cstring>
#include <cerrno>
#include <cstdlib>
int main(int argc, char **argv){
int child_pid;
if((child_pid=fork())<0){
fprintf(stderr,"%s",strerror(errno));
exit(1);
}
if(child_pid==0){
fprintf(stdout,"child PID= %d\n",getpid());
fprintf(stdout,"parent PID= %d\n",getppid());
exit(0);
}
fprintf(stdout,"main PID= %d\n",getpid());
}
>>
main PID= 27327
child PID= 27328
parent PID= 27327
fork()函数只会拷贝调用前的数据,之后的不受干涉
#include <zconf.h>
#include <stdio.h>
#include <cstring>
#include <cerrno>
#include <cstdlib>
int main(int argc, char **argv) {
int x = 1;
int child_fd;
if ((child_fd = fork()) < 0) {
fprintf(stderr, "err:%s", strerror(errno));
}
if (child_fd == 0) {
x++;
printf(" child x:%d \n", x);
}
printf(" main x:%d \n", x++);
}
>>
main x:1
child x:2
main x:2
回收子进程
当一个进程由于某种原因退出时,内核并不是立即把他从系统清除,相反,进程被保持在一种已经终止的状态,
直到被它的父进程回收。当父进程回收子进程时,内核将子进程退出的状态传递给父进程然后抛弃已终止的子进城,从这个时候开始,该进程就不存在了。一个终止但还没回收的进程称为僵死进程。
哦
如果
哦哦u