十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
根据调用需求,可以分为两种:
公司主营业务:成都网站设计、做网站、成都外贸网站建设公司、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出阿合奇免费做网站回馈大家。
一、仅执行系统命令,不需要该命令的打印结果。
这种情况可以用system函数。形式为
system(cmd);
其中cmd为char*类型的字符串,包含要执行的命令,命令的执行结果会输出到标准输出。
比如
system("mkdir test");
这个执行,会在当前文件夹下创建test文件夹。
二、需要命令执行的打印。
虽然同样可以使用system并重定向到文件,然后打开文件读取,最终删除文件。但这样做比较繁琐,更好的做法是使用popen。
FILE *fp = popen(cmd);
执行cmd中的命令,然后可以以C文件操作方式,读取命令的输出结果。比如:
if((fp=popen("pwd","r"))==NULL)//执行获取当前目录的系统命令pwd。
{
printf("执行失败\n");//fp为NULL表示命令执行失败。
}
else
{
char s[100];
while(fgets(s, 100, fp))//获取文件内容。
printf("%s", s);//输出结果。
pclose(fp);//关闭。
}
./rm filename和
在你的bash里面输入rm filename本质不是一样的么
就是把那个rm的实现放在你的自己的mini bash里面就可以了啊
调用
remove(filename);
就行了
1,首先需要了解cp的原理。
2,可以参考cp的源码去了解其原理
3,cp命令的源码可以在linux内核中找到。
4,或者下载busybox其中也会有cp的源码
只有了解其原理之后才能谈如何实现。参考代码如下:
#include stdio.h
#include stdlib.h
#include sys/stat.h
#include sys/types.h
#include fcntl.h
#include errno.h
#include unistd.h
#include string.h
#define BUF_SIZE 1024
#define PATH_LEN 128
void my_err(char *err_string, int line )
{
fprintf(stderr,"line:%d ",line);
perror(err_string);
exit(1);
}
void copy_data(const int frd,const int fwd)
{
int read_len = 0, write_len = 0;
unsigned char buf[BUF_SIZE], *p_buf;
while ( (read_len = read(frd,buf,BUF_SIZE)) ) {
if (-1 == read_len) {
my_err("Read error", __LINE__);
}
else if (read_len 0) { //把读取部分写入目标文件
p_buf = buf;
while ( (write_len = write(fwd,p_buf,read_len)) ) {
if(write_len == read_len) {
break;
}
else if (write_len 0) { //只写入部分
p_buf += write_len;
read_len -= write_len;
}
else if(-1 == write_len) {
my_err("Write error", __LINE__);
}
}
if (-1 == write_len) break;
}
}
}
int main(int argc, char **argv)
{
int frd, fwd; //读写文件描述符
int len = 0;
char *pSrc, *pDes; //分别指向源文件路径和目标文件路径
struct stat src_st,des_st;
if (argc 3) {
printf("用法 ./MyCp 源文件路径 目标文件路径\n");
my_err("arguments error ", __LINE__);
}
frd = open(argv[1],O_RDONLY);
if (frd == -1) {
my_err("Can not opne file", __LINE__);
}
if (fstat(frd,src_st) == -1) {
my_err("stat error",__LINE__);
}
/*检查源文件路径是否是目录*/
if (S_ISDIR(src_st.st_mode)) {
my_err("略过目录",__LINE__);
}
pDes = argv[2];
stat(argv[2],des_st);
if (S_ISDIR(des_st.st_mode)) { //目标路径是目录,则使用源文件的文件名
len = strlen(argv[1]);
pSrc = argv[1] + (len-1); //指向最后一个字符
/*先找出源文件的文件名*/
while (pSrc = argv[1] *pSrc != '/') {
pSrc--;
}
pSrc++;//指向源文件名
len = strlen(argv[2]);
// . 表示复制到当前工作目录
if (1 == len '.' == *(argv[2])) {
len = 0; //没有申请空间,后面就不用释放
pDes = pSrc;
}
else { //复制到某目录下,使用源文件名
pDes = (char *)malloc(sizeof(char)*PATH_LEN);
if (NULL == pDes) {
my_err("malloc error ", __LINE__);
}
strcpy(pDes,argv[2]);
if ( *(pDes+(len-1)) != '/' ) { //目录缺少最后的'/',则补上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/* 打开目标文件, 使权限与源文件相同*/
fwd = open(pDes,O_WRONLY | O_CREAT | O_TRUNC,src_st.st_mode);
if (fwd == -1) {
my_err("Can not creat file", __LINE__);
}
copy_data(frd,fwd);
//puts("end of copy");
if (len 0 pDes != NULL)
free(pDes);
close(frd);
close(fwd);
return 0;
}