标签:
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变量)。
标签:
原文地址:http://www.cnblogs.com/zhoudayang/p/5300198.html