实验五 Shell程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档