read 由于信号中断,没读到任何数据

第一天写博客,想想写什么呢,突然想到一年前遇到的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 );

原文地址:https://www.cnblogs.com/nullbaby/p/7064840.html