【发布时间】:2017-03-11 22:21:36
【问题描述】:
我试图在我的 c 程序中复制一个可执行文件。请看下面的代码:
int dumpDaExecutable(char *progpath){
char *base, *basec;
basec = strdup(progpath);
base = basename(basec);
printf("%s\n", base);
//rename(progpath, base);
FILE *ptr_of, *ptr_nf;
int x;
ptr_of = fopen(basec, "rb");
ptr_nf = fopen(base, "wb");
if(ptr_of == NULL){
printf("Old file is NULL\n");
return 1;
}
if(ptr_nf == NULL){
printf("New file is NULL\n");
fclose(ptr_of);
return 1;
}
unsigned char c[4096];
while(1){
//printf("in the while!\n");
x = fread(c, 1, 4096, ptr_of);
if(x < 1){
if(x == 0)
printf("success");
break;
}
if(fwrite(c, x, 1, ptr_nf) != 1){
break;
}
}
fclose(ptr_nf);
fclose(ptr_of);
//free(base);
//free(basec);
return 0;
}
我传递的 progpath 是 */program - 其中 * 是父文件夹,program 是实际的可执行文件。我的程序运行后,创建的新文件是空的。我很困惑为什么会这样。复制可执行文件时需要做一些不同的事情吗?
程序文件的权限设置为777。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
贴出的代码,为了安全起见,应该检查新文件和旧文件不是同一个文件。
-
发布的代码应该在调用后立即检查对
fopen()的调用是否成功/失败,而不是稍后的一些指令,当fopen()失败时,调用perror()那样会还输出操作系统认为对fopen()的调用失败的原因。 -
请发布一个完整的、最小的、可验证的代码和您正在使用的实际命令行。
-
贴出的代码名为
strdup(),但未能将结果指针传递给`free(),因此存在内存泄漏。