linux系统、网络等开发-02

工作需要,和大家共同学习总结。(学习的内容为传智播客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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值