进程-exec/僵尸和孤儿进程/wait/管道

exec函数族

        fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替代,从心程序的启动例程开始执行。调用exec并不是创建新进程,所以调用exec前后该进程id并未改变

execlp函数

加载一个进程 借助PATH环境变量
        int execlp(cosnt char* file, const char* arg,……);        成功:无返回    失败:-1
        参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参数1则出错返回。
        该函数通常用来调用系统程序。如:ls、date、cp、cat等命令

execlp实现子进程中执行ls -l -a

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void){
    pid_t pid;
    pid = fork();
    if(pid == -1){
        perror("fork error");
        exit(1);
    }else if(pid > 0){
        sleep(1);
        printf("parent\n");
    }else{
        execlp("ls","ls","-l","-a",NULL);
    }

    return 0;
}

execl函数

加载一个进程 通过 路径+程序名 来加载
        int execl(const char* path, const char* arg,……);    成功:无返回        失败:-1
对比execlp 如加载“ls”命令带有-l -F参数
execl("/bin/ls","ls","-l","-F",NULL);

使用execl实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void){
    pid_t pid;
    pid = fork();
    if(pid == -1){
        perror("fork error");
        exit(1);
    }else if(pid > 0){
        sleep(1);
        printf("parent\n");
    }else{
        execl("bin/ls","ls","-l","-a",NULL);
    }

    return 0;
}

execvp函数
加载一个进程 使用自定义环境变量env
        int execvp(const char* file,const char* argv[]);

dup2

把进程信息打印到文件中

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int fd;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值