第一天写博客,想想写什么呢,突然想到一年前遇到的bug。好吧,就你了。
代码:
CfgRet getConfigfilePath(char *ConfigfilePath)
{
char line[64] = {0};
char *pStr = NULL;
char *firstChar;
sprintf(line, "%s", "cfg_file_path.sh config");
FILE *pp = popen(line, "r");
if (pp != NULL)
{
char buf[256] = {0};
pStr = fgets(buf, sizeof(buf), pp);
if(pStr == NULL)
printf("fgets exec error.\r\n");
printf("config name length: %d\r\n",strlen(buf));
……..
return CFG_RET_SUCCESS;
}
问题描述:
在串口执行cfg_file_path.sh config能够标准输出config文件的路径。
代码执行pStr = fgets(buf, sizeof(buf), pp); 有时fgets的返回值pStr为NULL,打印fgets exec error。
代码修改:
CfgRet getConfigfilePath(char *ConfigfilePath)
{
char line[64] = {0};
char *pStr = NULL;
char *firstChar;
sprintf(line, "%s", "cfg_file_path.sh config");
FILE *pp = popen(line, "r");
if (pp != NULL)
{
char buf[256] = {0};
do
{
pStr = fgets(buf, sizeof(buf), pp);
if(feof(pp))
{
printf("End of file\n");
break;
}
} while ((pStr == NULL) && (errno == EINTR));
printf("config name length: %d\r\n",strlen(buf));
......
return CFG_RET_SUCCESS;
}
问题分析:
fgets会使用系统调用read,如果捕捉到SIGCHID,read调用就有被中断的可能。
在该进程初始化的时候,移除对该信号的处理,也可以解决避免SIGCHID会read的影响。main.c sigaction( SIGCHLD, &sa_child, 0 );