2013-10-12 29 views
0

我有一种情况,我提交了已经运行了五天的作业,但由于引入了错误,所有工作都可能丢失。我进行了一次“系统”调用来压缩数据文件,然后删除可能与4G一样大的原始未压缩文件。所以我有这样的C代码用于修改运行C程序行为的脚本

strcpy(command,"data"); ////I should added a forward slash here "data/" 
    sprintf(command,"%scompress -c -i %s -o %s",command,name,out_name); 
    system(command); 
    remove(name); /////This is the problem 

bug是sprintf的线,在我想要做的是在数据调用程序/压缩,但由于缺少“/”系统命令失败。因此,生成的数据不会被压缩,然后立即将原始文件删除,而不需要任何东西!如果它被压缩了,那就没问题了。

目前在这种状态下有五个正在运行的作业。我需要改变这种行为,以便我不会失去五天的工作。我正在考虑在当前目录中创建一个名为'datacompress'的假脚本来改变正在运行的程序的行为。我可以这样做吗?或者有更好的选择吗?

+1

两个提示:不要在'sprintf'中使用与源和目的地相同的缓冲区,您不知道函数将以何种顺序写入缓冲区。第二个是使用'snprintf'来代替,以避免可能的缓冲区溢出。 –

+0

另一个提示 - 更新您的简历! –

+0

我认为这可能是我使用sprintf导致问题的不好之处。即使我写了一个strcpy用“数据”来演示缺少的正斜杠,我实际上已经初始化为'data /',但不知何故斜线丢失了...... – danny

回答

2

您可以将datacompress作为data/compress的符号链接。糟糕,除非流程的$PATH包含.,否则这将不起作用。

另一种选择:删除用户对包含name的目录的写入权限。这将导致remove()功能失败。

如果您的系统具有访问控制列表,请删除该进程对未压缩文件的删除权限。

当你试图想出一个解决方案,可以中止与过程:

kill -STOP <pid> 
+0

好吧我添加了符号链接“ln -s data/compress datacompress”。希望它有效。但是我似乎无法像脚本那样执行它,如果符号链接是这样的工作的话。我无法更改用户权限,因为与以前版本的exe一起工作的其他作业仍在运行。感谢您的建议! – danny

+0

只是意识到它可能无法正常工作。如果命令名不包含'/',则在$ PATH中进行搜索。因此,除非'.'在'$ PATH'中,否则它不会在当前目录中执行命令。 – Barmar

+0

不幸的是,程序现在完成,但感谢您的建议。 – danny

1

创建硬链接(符号链接)进行数据文件:

ln datafile datafile.bkp 

当程序删除原始数据文件时,文件的内容将保留在.bkp文件名下。

然后修复程序来检查压缩命令等重要内容的错误状态。