我有一个C代码.. 我有以下UNIX代码:
l_iRet = system( "/bin/cp -p g_acOutputLogName g_acOutPutFilePath");
当我运行生成的二进制文件时......我收到以下错误:
cp: cannot access g_acOutputLogName
任何人都可以帮助我吗?
答案 0 :(得分:2)
您通常应该优先选择exec系列函数而不是系统函数。系统函数将命令传递给shell,这意味着您需要担心命令注入和意外参数扩展。使用exec调用子进程的方法如下:
pid_t child;
child = fork();
if (child == -1) {
perror("Could not fork");
exit(EXIT_FAILURE);
} else if (child == 0) {
execlp("/bin/cp", g_acOutputLogName, g_acOutPutFilePath, NULL);
perror("Could not exec");
exit(EXIT_FAILURE);
} else {
int childstatus;
if (waitpid(child, &childstatus, 0) == -1) {
perror("Wait failed");
}
if (!(WIFEXITED(childstatus) && WEXITSTATUS(childstatus) == EXIT_SUCCESS)) {
printf("Copy failed\n");
}
}
答案 1 :(得分:1)
大概g_acOutputLogName
和g_acOutPutFilePath
是程序中的char[]
(或char*
)变量,而不是实际路径。
您需要使用其中存储的值,而不是变量名称,例如:
char command[512];
snprintf( command, sizeof command, "/bin/cp -p %s %s",
g_acOutputLogName, g_acOutPutFilePath );
l_iRet = system( command );