apue- chapter 1 UNIX基础知识

1.C++实现ls命令

#include<dirent.h>
#include<stdlib.h>
#include<iostream>
#include "apue.h"
using namespace std;
int main(int argc,char * argv[]){
    DIR *d
    struct dirent *dirp;
    if(argc!=2){
        cout<<"usage: ls directory_name"<<endl;
        exit(-1);
    }
    if((dp=opendir(argv[1]))==NULL){
        cout<<"can‘t open "<<argv[1]<<endl;
    }
    //循环读取目录项
    while((dirp=readdir(dp))!=NULL){
        //输出文件名称
        cout<<dirp->d_name<<endl;
    }
    closedir(dp);

    exit(0);
}

opendir函数返回指向DIR结构的指针,我们将该指针传送给readdir函数。在循环中调用readdir来读取每个目录项。该函数返回指向dirent结构的指针,而当目录中没有目录项可读时返回空指针。然后在循环中输出从dirent结构中取出的每个目录项的名称。

2.C++ 实现从输出从标准输入中读到的内容

#include "apue.h"
#include<iostream>
using namespace std;
#define BUFFSIZE 4096
int main(){
    int n;
    //缓冲
    char buf[BUFFSIZE];
    //从标准输入中读取,缓冲区大小为BUFFSIZE,缓冲区对应buf
    while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0){
        //向标准输出输出buf中的内容
        if(write(STDOUT_FILENO,buf,n)!=n)
            cout<<"wirte error"<<endl;
    }
    //读取标准输入出错
    if(n<0)
        cout<<"read error"<<endl;
    exit(0);
}

运行截图:

3.使用标准I/O实现例2中的内容

  标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小。

  以下用getc函数与putc函数实现例2中的功能。

#include "apue.h"
#include <iostream>
using namespace std;
int main(){
    int c;
    while((c=getc(stdin))!=EOF){
        if(putc(c,stdout)==EOF)
            cout<<"output error"<<endl;
    }
    if(ferror(stdin))
        cout<<"input error"<<endl;

    return 0;
}

3.输出进程ID

  UNIX确保每个进程都有唯一的数字标识符,成为进程ID。进程ID是一个非负整数。

  下面是一个输出本程序进程ID的 程序代码。

#include "apue.h"
#include <iostream>
using namespace std;
int main(){
    cout<<"hello world from process ID"<<getpid()<<endl;
    return 0;
}

分别运行两次,输出如下:

hello world from process ID18357

hello world from process ID18385

4.开辟新进程执行输入的命令

  利用C++对标准输入 输入的命令开辟新的进程加以执行。

#include "apue.h"
#include <sys/wait.h>
#include <iostream>
using namespace std;
int main(){
    char buf[MAXLINE]; //MAXLINE->4096
    pid_t pid;
    int status;
    cout<<"%% ";/* print prompt (printf requires %% to print %)*/
    while(fgets(buf,MAXLINE,stdin)!=NULL){
        //fets函数返回的每一行都以换行符结束,后面紧随一个‘\0‘,需要将换行符号替换为‘\0‘
        if(buf[strlen(buf)-1]==‘\n‘)//最后一个字符是换行符
            buf[strlen(buf)-1]=‘\0‘;//将其替换为结束符号
        //调用fork()创建新进程,fork对父进程返回子进程的ID,对子进程返回0.fork调用一次,在父进程和子进程中各调用一次
        if((pid=fork())<0){
            cout<<"fork error"<<endl;
        }else if(pid==0){//成功创建子进程
            //在子进程中执行buf对应的命令,
            execlp(buf,buf,(char *)0);
            cout<<"could‘t execute: "<<buf<<endl;
            exit(127);
        }
        //父进程等待子进程结束
        //waitpid()函数返回子进程的终止状态,保存在status中
        /* parent */
        if((pid=waitpid(pid,&status,0))<0)
            cout<<"wait pid error!"<<endl;
        cout<<"%% ";
    }

    return 0;
}

执行过程:

%% ls
b		CMakeFiles	     hello_world      Makefile
CMakeCache.txt	cmake_install.cmake  hello_world.cbp
%% date
2016年 03月 20日 星期日 23:01:21 CST

  上述程序的重点是函数fork以及函数waitpid。fork创建一个新进程。fork对父进程返回子进程的进程ID(非负整数),对子进程返回0。fork调用一次,对父进程和子进程各返回一次。

  父进程等待子进程终止是通过waitpid实现的,其参数指定要等待的进程(pid指定),返回子进程的终止状态(status变量)。

时间: 2024-08-09 10:24:59

apue- chapter 1 UNIX基础知识的相关文章

APUE第一章 UNIX基础知识

前语:本人是半路出家做程序员,实际上应付平时工作中的业务还可以,但是基础知识实在薄弱,当然也跟中国计算机教育有关系,平时跟同事聊天,实际上就算是科班出身,对于计算机本身的了解也知之甚少,因此在毕业两周年到来的时候,给自己确定了以后的技术学习方向,同时也决定了将基础部分补充起来,特来CSDN开这个专题,去学习程序员圣经般著作-<UNIX高级环境编程>,这本书也是被某个同事经常提起,书本比较厚,但是不能操之过急,但是也不要指望一次性就能学完学透,没事回来看看,总有收获,自勉之. 一.UNIX体系结

APUE 学习笔记(一) Unix基础知识

1. Unix 体系结构 内核的接口被称为系统调用 公用函数库构建在系统调用接口之上 应用软件既可以调用公用函数库,也可以直接进行系统调用 2. 文件和目录 目录操作函数:opendir---> readdir---> closedir struct dirent 结构体 stat 系统调用 3.程序.进程.线程 程序:存放在磁盘上.并处于某个目录中的一个可执行文件.使用exec系列函数将程序从磁盘读入存储器,并使其执行 进程:程序的执行实体.进程控制的3个函数:fork.exec.waitp

APUE(1)----UNIX基础知识

一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们也将这种软件成为内核,因为它相对较小,并且位于环境的核心.内核的接口被称为系统调用.公共函数库构建在之上,普通的应用程序可以调用系统调用,也可以调用公共函数库.shell是一个特殊的应用程序,位运行其他应用程序提供了一个接口. 二.文件和目录 1.文件系统 UNXI文件系统是目录和文件的

UNIX 基础知识

登陆  1.登录名 系统在其 口令文件(通常是/etc/passwd文件) 中查看用户名,口令文件中包含了有关用户的信息. 2.shell shell是一个命令解析器,读取用户输入的内容,然后执行命令.   文件和目录 1.文件系统 UNIX文件系统是 目录 和 文件 的一种层次结构. 所有 的起点成为根(root)目录, 根目录的名称是一个” / ”           目录 是一个包含目录项的文件. 可以认为每个目录项都包含一个文件名,同时还包含文件属性的信息(stat和fstat函数返回包

UNIX,基础知识,文件IO,文件和目录

2015.1.27星期二,早晨阴天,中午下雪了今天上午老师不上课,程序语句,记一下:main(void){ int c; while((c = getc(stdin)) != EOF) if(putc(c,stdout) == EOF) 将字符写到标准输出 err_sys("output error"); if(ferror(stdin)) err_sys("input error"); exit(0);} 从标准输入读命令并执行:int main(){ char

UNIX基础知识

一.UNIX 系统 UNIX内核的接口称之为系统调用.公用函数库构建在系统调用接口之上.应用程序既可以使用公用函数库,也可以使用系统调用. UNIX shell 是一个特殊的应用程序,它为其他应用程序提供了一个接口. 路径名由斜线分隔的一个或者多个文件名组成的序列: 以斜线开头的路径名称为绝对路径名 以非斜线开头的路径名称为相对路径名 文件系统根的名字 / 是一个特殊的绝对路径名.它不包含任何其他的字符. 查看UNIX系统ls命令的 man帮助手册:man 1 ls或者 man -s1 ls.

自学:Unix环境高级编程 第一章 Unix基础知识

1.2 Unix体系结构 内核(kernel):控制计算机硬件资源,提供程序运行环境. 系统调用(system call):内核的接口. 公用函数库构建在系统调用接口之上. 应用程序既可使用公用函数库,也可使用系统调用 shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口. 1.3 登录    1.登录名 系统在其口令文件(通常是/etc/passwd文件)中查看登录名. 例如:sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh 口令文件中的登

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的

第一章 UNIX 基础知识

1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数库构建在系统调用上,应用软件既可以使用公用函数库,也可以使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供一个接口. 下图为 UNIX 体系结构: 广义上,OS包括内核和一些软件,例如 Linux 是 GNU 操作系统使用的内核,可以称这种操作系统为 GNU/Linux,但是通常