【问题标题】:Unable to identify behaviour of execl() function call无法识别 execl() 函数调用的行为
【发布时间】:2012-08-20 14:46:57
【问题描述】:

当我需要使用“curl”从 www 获取一些数据时,我正在处理我的项目。现在首先我尝试了直接 system() 函数但它没有工作,奇怪的是每次它在使用 gcc 编译时破坏了整个源代码文件。幸运的是,我正在单独测试它。 然后我测试了 execl() 函数,这段代码编译正常,gcc 给了我一个 .exe 文件来运行,但是当我运行它时没有任何反应,出现空白窗口。代码:

    int main(){
        execl("curl","curl","http://livechat.rediff.com/sports/score/score.txt",">blahblah.txt",NULL);
         getch();
    return 0;
    }

包含未正确显示,但我已包含 stdio、conio、stdlib 和 unistd.h。 如何获取程序的输出以存储在文本文件中?同样运行上述命令会在我的文档中创建和存储文本文件,我希望它位于我运行程序的本地目录中。我该怎么做?

【问题讨论】:

  • 如果您有兴趣,可以使用第二个选项来执行此特定操作。 libCurl 有什么特别的原因要使用 execl 来执行 curl 命令行实用程序吗?
  • 看起来很简单,我可以从DOS手动运行curl并在文本文件中获取输出,也出于学习目的,我想知道我做错了什么?其次,我无法在我的系统上正确使用 libcurl。 gcc 给出错误“找不到-lcurl”。所以我选择了这个替代方案。

标签: c curl system


【解决方案1】:

需要提供curl的路径,不能使用重定向,因为应用程序不会通过bash执行。而是使用-o 标志并指定文件名。另外,execl 成功时不会返回:

#include <unistd.h>
#include <stdio.h>
int main(){
  execl("/usr/bin/curl",
        "curl","http://livechat.rediff.com/sports/score/score.txt",
        "-oblahblah.txt",NULL
  );
  printf("error\n");
  return 0;
}

【讨论】:

  • 我在 Windows 上。 curl 位于环境变量 PATH 列表中的目录中。上面的程序正在打印“错误”,我尝试将第一个参数更改为“curl”而不是“/usr/bin/curl”。
  • 改成你系统中curl的绝对路径如'C:\\dir/curl.exe'
  • 成功了! Thnq :-) 一如既往--stackoverflow=programmers Heaven
【解决方案2】:

如果您希望您的代码返回,您应该派生一个子进程来运行该命令。这样就可以查看返回码了。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#define CURL "/usr/bin/curl"

int main()
{
  pid_t pid;
  int status;

  pid = fork();

  if (pid == 0)
  {
    execl(CURL, CURL, arg1, NULL);
  }

  else if (pid < 0)
  {
    printf("Fork failed\n");
    exit (1);
  }

  else
  {
    if (waitpid(pid, &status, 0) != pid)
      status = -1;
  }

  return status;
}

arg1 是您想与 curl 一起使用的任何参数,或者如果您没有使用任何参数,那么您显然可以省略它。

【讨论】:

  • 无论如何我喜欢你的#define 想法。我真的需要这个。只是不知道为什么它没有出现在我的脑海中。可能是因为我在看 Eng vs SA 时正在编码,它真的变得很有趣:-D
  • @vish213 我刚刚发现,至少其他答案有效!
  • 我也需要稍后再说。现在只是一个小问题,每次我想更新分数时,我可以为此运行一个单独的线程吗?我的意思是使用for循环,休眠一段时间(我需要每分钟更新一次分数),然后创建一个新线程-专门运行这个execl()?
  • 我对它不太熟悉,但我最好的猜测是创建一个可以在您的机器上作为服务运行的 shell 脚本,并在该脚本中不断地调用您的 C 程序。您通常会通过创建无限循环来做到这一点。抱歉,我帮不上忙,我相信您可以在网上四处寻找一些示例。我也可以看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2018-01-31
  • 2015-05-02
  • 2022-06-23
  • 2011-07-10
  • 2017-06-04
相关资源
最近更新 更多