我正在嘗試使用系統呼叫來復制和重命名檔案cp。問題是命令在通話期間發生了變化,我不知道如何修復它。
char *cp=(char*) malloc(100);
snprintf(cp,100,"%s%s%s","cp ~/.nanorc ~/.nanocfgmgr/",arg,"\0" );
printf("%s\n",cp);
system(cp);
free(cp);
cp ~/.nanorc ~/.nanocfgmgr/newfile直接在終端中執行應該看起來像 的字串按預期作業,但運行程式會產生cp: cannot create regular file '/home/user/.nanocfgmgr/.nanocfgmgr/newfile。我無法弄清楚為什么目錄會重復。
編輯:示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <argp.h>
struct parser_args{
int argc;
char **argv;
int *nargs;
char *path;
};
//where 'cp' is called
int parser(int key,char *arg, struct argp_state *state){
switch(key){
case 's': ;
char *cp=(char*) malloc(100);
snprintf(cp,100,"%s%s%s","cp ~/.nanorc ~/.nanocfgmgr/",arg,"\0" );
printf("arg = [[%s]]\n", arg); printf("cp = [[%s]]\n", cp);
system(cp);
free(cp);
}
return 0;
}
int main(int argc, char **argv){
char path[50]={};
strcpy(path,strcat(getenv("HOME"),"/.nanocfgmgr"));
char cfg_path[50]={};
strcpy(cfg_path, path);
strcat(cfg_path, "/configs.json");
char *mkdir=(char*) malloc(50);
strcpy(mkdir,"mkdir ");
strcat(mkdir,path);
strcat(mkdir," > /dev/null 2>&1");
system(mkdir);
free(mkdir);
struct argp_option options[]={
{"save",'s',"NAME",0,"Backs up the configuration file Usage: nanocfgmr NAME [DESCRIPTION]"},
{0}
};
struct argp argp={options,parser};
struct parser_args *input= (struct parser_args*) malloc(sizeof(struct parser_args));
return argp_parse(&argp,argc,argv,0,0,input);
}
uj5u.com熱心網友回復:
問題是由于
strcat(getenv("HOME"),"/.nanocfgmgr")
getenv()不分配新字串,它回傳指向環境陣列中字串的指標。當您連接到這個時,您正在修改環境(您可能還覆寫了后面的環境變數HOME)。
當 shell 處理以 開頭的檔案名時~,將其替換為HOME環境變數變數。由于您已添加.nanocfgmgr到此,因此您的路徑名相對于該子目錄進行擴展。
POSIX指定您不應該進行這種連接;它說:
應用程式應確保它不會修改
getenv()函式指向的字串。
理想情況下,它應該宣告為 return const char *,然后代碼將無法編譯,但可能有歷史原因導致它無法編譯。
您可以使用snprintf()而不是strcat(),那么您將不會修改環境。
snprintf(path, sizeof path, "%s/.nanocfgmgr", getenv("HOME"));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/497155.html
上一篇:在linux中記錄已洗掉的檔案
