系统级程序设计(三)

这节课……讲的有点多,总结起来可能会有点杂。一、补进程管理的尾巴。二、继而介绍了进程同步。三、提到了部分进程间的管道通信。我一个一个来复习总结。

进程管理收尾

当父进程通过fork()创建了一个子进程,由于子进程是讲父进程的程序完完全全的复制过来的,当我们需要在子进程中执行一些指令那么父进程必须先设置,所以为了解决这个问题引入一个函数exec家族的函数。简单的回顾一下吧,一天满课晚上还要补博客,害!!

exec族

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char * const argv[]);
int execvp(const char *file, char * const argv[]);
int execve(const char *path, char * const argv[], char * const envp[]);

exec家族有六个函数,作用也都大同小异,其最终目的都是为了执行命令。在这之中又细分两类,

  • execl类:函数将以列举的形式传入参数,由于参数列表的长度不定,所以要用哨兵NULL表示列举结束;
  • execv类:函数将以参数向量表传递参数,char * argv[]的形式传递文件执行时使用的参数,数组中最后一个参数为NULL;

提醒一下,有些参数是path有些参数又是file两个有一点细微的区别。当参数是path时,传入的为命令的路径名;当参数是file,传入的可执行文件名。

至于函数几个函数到底该怎么使用,看看后面的案例就会明白怎么使用、有什么作用了。

案例四

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
    pid_t tempPid;
    tempPid=fork();
    if(tempPid == -1){   
        perror("fork error");
        exit(1);
    } else if(tempPid > 0) {   
        printf("parent process:pid=%d\n", getpid());
    } else {   
        printf("child process:pid=%d\n", getpid());
        //execl("/bin/ls","-a","-l","./",NULL);	//①
        //execlp("ls","-a","-l","./",NULL);	//②
        char *arg[]={"-a","-l","./", NULL};	//③
        execvp("ls", arg);
        perror("error exec\n");
        printf("child process:pid=%d\n", getpid());
    } //of if  
    return 0;
} //of main

以上即为大概格式,可以用ls命令查看文件夹中的文件、以路径查看文件等等。除了ls还可以用其它的命令,只要时bash能执行的在exec家族中也能。

exit函数

 其实exit这个玩意儿,只要学过编程的应该都了解一些,

void exit(int status);

参数status即状态,为0时正常退出,其它值为异常退出,但其实exit是一个集成的函数,也就是被封装过的,在exit封装内部

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

errorr0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值