工作需要,和大家共同学习总结。(学习的内容为传智播客linux服务器开发二、三部分)
1、execlp执行程序并将结果写入文件:?
#include<unistd.h>
#include<fcntl.h>
#include<cstdlib>
#include<iostream>
using namespace std;
int main(){
pid_t pid;
int fd;
cout<<"execlp test"<<endl;
fd=open("ps.out",O_WRONLY|O_CREAT|O_TRUNC,0644);
if(fd<0){
cout<<"open ps.out error"<<endl;
return 1;
}
//目标 源
dup2(fd,STDOUT_FILENO);
execlp("ps","ps","aux",NULL);
close(fd);
return 0;
}
2、孤儿进程
父进程先于子进程结束,子进程成为孤儿进程。 子进程的父进程成为init进程,称为init领养孤儿进程。
3、僵尸进程
进程终止,父进程尚未回收,子进程残留资源(PCB)存放在内核中,变成僵尸进程。
主进程中使用wait()阻塞地回收单个子进程,waitpid()可以指定pid进程清理,可以不阻塞。
?这里wait(NULL)删除了随机的一个子进程
#include<unistd.h>
#include<cstdlib>
#include<iostream>
#include<sys/wait.h>
using namespace std;
int main(int argc,char * argv[]){
pid_t p,q;
int n=5,i;//默认创建5个进程
cout<<"loop fork test"<<endl;
if(argc==2){
n=atoi(argv[1]);
}
for(i=0;i<n;i++){
p=fork();
if(p==0){
break; //如果是子进程,则退出子进程逻辑
}else if(i==3){
q=p; //保留子进程的pid
}
}
if(n==i){
sleep(n);
wait(NULL);//阻塞地终结一个进程
while(1);
cout<<"我是父进程"<<endl;
}else{
sleep(i);
cout<<"我是子进程"<<endl;
cout<<"getpid(): "<<getpid()<<endl;
cout<<"getppid(): "<<getppid()<<endl;
//子进程退出,
}
return 0;
}
使用waitpid(pid,NULL,0)阻塞的删除一个进程?
#include<unistd.h>
#include<cstdlib>
#include<iostream>
#include<sys/wait.h>
using namespace std;
int main(int argc,char * argv[]){
pid_t p,q;
int n=5,i;//默认创建5个进程
cout<<"loop fork test"<<endl;
if(argc==2){
n=atoi(argv[1]);
}
for(i=0;i<n;i++){
p=fork();
if(p==0){
break; //如果是子进程,则退出子进程逻辑
}else if(i==3){
q=p; //保留子进程的pid
}
}
if(n==i){
sleep(n);
//wait(NULL);//阻塞地终结一个进程
waitpid(q,NULL,0);
while(1);
cout<<"我是父进程"<<endl;
}else{
sleep(i);
cout<<"我是子进程"<<endl;
cout<<"getpid(): "<<getpid()<<endl;
cout<<"getppid(): "<<getppid()<<endl;
//子进程退出,
}
return 0;
}
?
|