// 练习无名管道的通信,删除指定目录下的指定后缀的文件。(编写一个.c文件即可)
// 要求:子进程负责遍历文件,父进程就负责删除文件。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<dirent.h>
/*
* 无名管道:
* fds[0]表示读
* fds[1]表示写
*/
int main(int arc,char **argv)
{
if(arc!=3)
{
printf("参数格式:如.app<传入一个文件> 要删除的文件类型(如:.txt)\n");
exit(-1);
}
int fds[2];
pipe(fds);
char buff[100];
char cmd[100];
int statu;
int pid=fork();
int len;
DIR *dirp=NULL;
struct dirent *dir;
if(pid==0)
{
dirp=opendir(argv[1]);
while(dir=readdir(dirp))
{
int size=strlen(dir->d_name);
if(strcmp((dir->d_name+(size-strlen(argv[2]))),argv[2])==0) //查找所要删除的后缀
{
strcpy(buff,dir->d_name);
strcat(buff," ");
write(fds[1],buff,strlen(buff));
}
}
closedir(dirp);
}
else
{
len=read(fds[0],buff,100);
buff[len]='\0';
strcpy(cmd,"rm "); //将rm复制到cmd
strcat(cmd,"-rf "); //将-rf接到rm后面
strcat(cmd,buff); //将buff的内容加到cmd后面
printf("cmd=%s\n",cmd);
chdir(argv[1]); //移到指定目录下
system(cmd); //执行最终的操作
wait(&statu); //随机等待一个子进程退出
}
return 0;
}
strcmp((dir->d_name+(size-strlen(argv[2]))),argv[2])==0)
dir->d_name其中的d_name为指针 指向的是遍历目录文件名的开头,size-strlen(argv[2])将文件指针移到后缀的处;
如123.txt一开始指针在1处,size-strlen(argv[2])后指针移到"."处,这样dir->d_name输出的为.txt
查找指定的后缀也可以使用strstr(p->d_name,argv[2]),在字符串中查找相应的字符串,如果有则返回首地址,没有则返回空。
如有错误请指出,谢谢!