crontab的相对路径的问题

1、背景

最近写了一个小程序,读取相对路径下的文件,部分代码如下:

bool read(const char*path)
{
        ifstream fin(path);
	string strLine;
	while(!fin.eof())
	{
		getline(fin, strLine);
		if(strLine.empty())
		{
			continue;
		}
	}
	fin.close();
	return true;
}

int main(void)
{
    read("./config.ini");
    return 0;
}
gdb调试均ok,于是放到crontab中去运行。结果第二天过来看,发现程序依然在跑着?!擦,肯定是有shi循环了。

2、问题

咋回事呢?gdb调试一切ok,貌似木有问题啊。没办法,祭出利器——log调试。发现程序一直在while(!fin.eof())处纠结(一直返回false),蛋疼……为啥呢?

亲(擦,淘宝体了),如果config.ini文件不存在,程序会形成死循环,fin.eof()永远返回false。

但是config.ini文件明明是存在的啊,gdb也是ok的。各种头疼,囧,org……

3、解决

那看来是通过crontab执行的问题了,肯定是没有找到config.ini文件,那肯定是使用相对路径有问题,果断换成绝对路径,正常!

为啥?google之,发现“crontab执行shell时,是不会进入到shell脚本所在的路径下执行的,如果shell里含有相对路径的话,会找不到路径的,因此shell脚本中都要使用绝对路径。”

原来如此。

为了尽量避免打开文件失败从而死循环的问题,我们需要在代码里加上如下一段代码:

if(!fin)
{
	return false;
}
当发现没有文件时,就直接返回错误,至少不会死循环了。

那如何解决crontab无法使用相对路径的问题呢?在程序里全部使用绝对路径。但是好麻烦,有木有更简单的方法呢?有的,比如在main函数里调用chdir()函数,直接进到该程序所在的文件夹就好了。

#include <unistd.h>

int main(void)
{
	......
	chdir("/tmp/mydocument");
	......
}



你可能感兴趣的:(shell,String,脚本,Google,Path)