1

我在我的程序中使用 popen 启动 pppd,以使获取 IP 地址和接口名称更容易一些。我的代码独立运行良好,是一个非常典型的实现。当它在整个程序中运行(太大而无法发布)时,问题就开始了……循环似乎在 fgets() 行中挂了很长一段时间。popen 在自己的线程中启动,然后根据输出进行管理。

popen/pppd 代码基本上如下。

int main(void){
    pthread_create(&thread, NULL, pppd, (char *)NULL);
    pthread_join(thread, NULL);

    return 0;
}

void *pppd(char *args){
    char* command = malloc(32);

    sprintf(command, "pppd %s call %s", dev, provider);
    pppd_stream = popen(command, "r");

    if(pppd_stream == NULL){
        pppd_terminated = TRUE;
        return;
    }

    free(command);

    while(fgets(buffer, 128, d->pppd_stream) != NULL){

        //handle_output
    }

}

CPU 使用率不是问题,系统和程序的其他部分仍然响应并按预期运行。

关于什么可能导致这种放缓的任何想法?

4

1 回答 1

0

确保您的命令是以空字符结尾的字符串

#define COMMAND_BUFFER_SIZE    256   /* Modify this if you need */

snprintf(command, COMMAND_BUFFER_SIZE, "pppd %s call %s", dev, provider);
command[COMMAND_BUFFER_SIZE - 1] = '\0';
pppd_stream = popen(command, "r");

编辑:

检查您的fgets

while(fgets(buffer, 128, d->pppd_stream) != NULL){

你可能想要这个:

while(fgets(buffer, 128, pppd_stream) != NULL){
于 2012-08-12T21:14:17.660 回答