【问题标题】:pppd popen hanging in Cpppd popen 挂在 C 中
【发布时间】:2012-08-12 20:30:18
【问题描述】:

我在我的程序中使用 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 使用率不是问题,系统和程序的其他部分仍然响应并按预期运行。

您有什么想法会导致速度变慢吗?

【问题讨论】:

  • 你检查返回值不是NULL吗?
  • 是的,很抱歉这存在于完整版本中。我现在将更新一个更准确的实现。
  • 你的进程有多大,你有多少内存?此外,您可以使用strace -f 并跟踪子进程以查看是否存在使pppd 挂起的系统调用。从命令行运行pppd 命令时是否挂起?
  • 我有大约 128MB 的 RAM 超出了 2GB 的空闲空间。从终端运行 pppd 并没有遇到同样的问题,但是我注意到一个 pppd 会话即使在尝试 kill 和 killall 后也没有退出。一次重新启动后,命令行现在的行为方式相同。 strace -f 似乎也挂在“ioctl(8, TIOCSETD”
  • 好像是pppd的问题?如果我要删除的设备上已锁定,我正在让我的程序终止现有的 pppd 会话。我也在手动清理锁定文件。 PPPD 退出时似乎不再离开锁定文件,它现在按预期工作......我现在更加困惑。我也没有更改 pppd 选项文件来阻止它锁定。

标签: c linux popen pppd


【解决方案1】:

确保您的命令是空终止字符串

#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){

【讨论】:

  • 谢谢,在我的程序中,我实际上在使用之前将数组设置为 '\0'。这应该具有相同的效果,我可能应该停止修剪我的代码以供上传。
  • snprintf 总是 null 终止,除非 size 参数为零,在这种情况下它什么也不写。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 2015-08-18
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多