代码之家  ›  专栏  ›  技术社区  ›  Feroze Mohamed

如果将输出重定向到文件,则Linux进程行为错误(mqtt)

  •  0
  • Feroze Mohamed  · 技术社区  · 7 年前

    我开发了Linux模块,它使用TCP上的MQTT通信。 直到我编写了一个脚本来自动启动模块并将stdout和stderr重定向到一个文件,功能才有问题。

    重定向之后,所有其他通信工作正常,但MQTT通信存在问题。如果我每1秒发一条信息,他们会在30多秒后突然出现。

    这种奇怪的行为只有在我使用输出重定向到文件时才会发生。

    我的启动脚本

    /bin/su -c "/usr/local/bin/TestApp 2>&1 | awk '{ print strftime(\"%F %T TestApp:\"), \$0; fflush(); }' | tee -a /home/TestApp.txt &" - root
    

    然后我尝试了这个(但同样的问题)

    /bin/su -c "/usr/local/bin/TestApp 2>&1 | tee -a /home/TestApp.txt &" - root
    

    所以我试过这个(同样的问题)

    /usr/local/bin/TestApp 2>&1 | tee -a /home/TestApp.txt &
    

    这个也不行

    /usr/local/bin/TestApp 2>&1 > /home/TestApp.txt &
    

    唯一没有问题的是

    /usr/local/bin/TestApp 2>&1
    

    由于输出重定向,MQTT通信行为不正常的原因是什么?

    请帮忙。

    编辑:添加的MQTT代码:

    mqtt init函数:

    int mqttInit(void) {
    MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
    int rc;
    
    MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE,NULL);
    
    MQTTAsync_setCallbacks(client, NULL, connlost, msgarrvd, NULL);
    
    conn_opts.keepAliveInterval = 300;//20;
    conn_opts.cleansession = true;
    conn_opts.onSuccess = onConnect;
    conn_opts.onFailure = onConnectFailure;
    conn_opts.context = client;
    conn_opts.automaticReconnect = true;
    
    if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) {
        printf("Failed to start connect, return code %d\n", rc);
        rc= EXIT_FAILURE;
      }
    
      return rc;
    }
    

    接收数据时获取triggerd的函数:

    int msgarrvd(void *context, char *topicName, int topicLen,MQTTAsync_message *message) {
    int i;
    char* payloadptr;
    char temp[20];
    int rc;
    
    printf("===================\n MQTT msgarrvd: \n topic: %s \n paylength=%d \n payload=", topicName, message->payloadlen);
    
    for (i = 0; i < message->payloadlen; i++) {
        msgarrvd_Buff[i] = *payloadptr++;
        printf("%02X", msgarrvd_Buff[i]);
    }
    
    printf("\n===================\n");
    printf("Message arrived \r\n");
    

    }

    1 回复  |  直到 7 年前
        1
  •  0
  •   Feroze Mohamed    7 年前

    好吧,看来注释中提到的@user803422就是解决方案。

    在敲打我的头这么长时间后,我在主文件中添加了下面一行代码,现在它按预期工作。

    setbuf(stdout, NULL );