实验五 Shell程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五Shell程序设计
1.编写一个Shell程序findit,该程序搜索参数1指定的目录树,查找所有的以.c和.h结尾的文件,如文件行中含有参数指定的字符串,显示该行和相应的文件名。如目录参数1缺省,则从当前目录中搜索。如:findit /home/wang/work searchstring
搜索以/home/wang/work为根的目录树中的c程序和头文件,查找含有searchstring字符串的行,显示文件名。
findit searchstring
从当前目录开始搜索。
2.编一Shell程序,以类似书本的目录结构的形式,按层次输出当前目录树中的所有目录和文件,要求每一层缩进4个空格。
/* sockcom.h */
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 1024
#define PORT 3333
typedef struct fileinfo {
char fname[50];
long length;
}FILEINFO, *Pfileinfo;
/*
* SocketServer.c
* */
#include "sockcom.h"
int initSocket() {
int sockfd, length;
struct sockaddr_in server;
char buf[BUFSIZE];
sockfd=socket(AF_INET, SOCK_STREAM,0);
if (sockfd<0) error("Error open socket.");
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(PORT);
if (bind(sockfd,(struct sockaddr *)&server, sizeof(server))<0)
error("Error bind addr and port.");
length=sizeof(server);
if (getsockname(sockfd, (struct sockaddr *)&server, &length)<0) printf("getting socket name\n");
printf("socket port #%d\n", ntohs(server.sin_port));
listen(sockfd, 5);
return sockfd;
}
int main(int argc, char *argv[])
{
int sockfd, newsockfd, length, n;
char buf[BUFSIZE];
sockfd = initSocket();
while(1) {
newsockfd = accept(sockfd, (struct sockaddr *)0, (int *)0);
int pid;
if ((pid=fork())>0) {
close(sockfd);
bzero(buf, sizeof(buf));
FILEINFO fileinfo;
bzero(fileinfo.fname, sizeof(fileinfo.fname));
if ((n = read(newsockfd, &fileinfo, sizeof(fileinfo)))<0) error("Protocal error.");
printf("Received meta fileinfo, name: %s,
length: %d\n", fileinfo.fname, fileinfo.length);
int fd=creat(fileinfo.fname, 0644);
long received=0;
while((n=read(newsockfd, buf, BUFSIZE))>0) {
write(fd, buf, n);
received+=n;
if (received==fileinfo.length) {
break;
}
}
close(fd);
printf("Receive file completed, saved to %s.\n", fileinfo.fname);
exit(0);
}
close(newsockfd);
}
return 0;
}
#include
#include
void error(char *msg) {
printf("%s\n", msg);
exit(1);
}
#include "sockcom.h"
int initSocket(char *rhost) {
int sockfd;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd<0) error("Error opening stream socket.");
if ((hp=gethostbyname(rhost))==NULL) error("%s Unknow host.", rhost);
server.sin_family = AF_INET;
bcopy((char *)hp->h_addr, (char *)&server.sin_addr.s_addr,
hp->h_length);
server.sin_port=htons(PORT);
if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))<0)
error("Error connect to remote server." );
return sockfd;