【问题标题】:starting/stopping service in /etc/init.d/ with fork and execvp does not work使用 fork 和 execvp 在 /etc/init.d/ 中启动/停止服务不起作用
【发布时间】:2015-09-14 12:52:47
【问题描述】:

我开发了以下函数以便从我的 C 代码中执行 shell 命令

int mycmd(char *cmd, int n, ...)
{
    va_list arg;
    int i, pid;
    static int mycmd_pfds[2];

    char *argv[n+2];
    argv[0] = cmd;

    va_start(arg,n);
    for (i=0; i<n; i++)
    {
        argv[i+1] = va_arg(arg, char*);
    }
    va_end(arg);
    argv[n+1] = NULL;


    if (pipe(mycmd_pfds) < 0)
        return -1;

    if ((pid = fork()) == -1)
        return -1;

    if (pid == 0) {
        /* child */
        close(mycmd_pfds[0]);
        dup2(mycmd_pfds[1], 1);
        close(mycmd_pfds[1]);

        execvp(argv[0], (char **) argv);
        exit(ESRCH);
    } else if (pid < 0)
        return -1;

    /* parent */
    close(mycmd_pfds[1]);

    int status;
    while (waitpid(pid, &status, 0) != pid);

    close(mycmd_pfds[0]);
    return 0;
}

此函数适用于像 ls 这样的 linux 命令。但是当我使用此功能启动服务时,它不起作用,然后服务没有启动。

我试过了

mycmd("/etc/init.d/sysntpd", 1, "start");

我也试过了

mycmd("/bin/sh", 2, "/etc/init.d/sysntpd", "start");

两者都不起作用。我在脚本开头添加了echo,我可以看到(带有管道的read)显示了echo消息但服务没有启动。

我错过了什么?如何使服务从我的 C 代码启动? (我应该只打电话给/etc/init.d/sysntpd)。

【问题讨论】:

  • 为什么从您的代码中完成而不是让系统自动完成是个好主意?
  • @JonathanLeffler 事实上,我正在使用 C 代码开发数据模型。用户可以在其中要求我的应用程序启动或停止所需的服务。
  • 如果execvp() 失败,您可以改进错误报告:将errnostrerror(errno) 打印到标准错误。您是否遇到权限问题?您是否以 root 身份运行您的服务?管道是干什么用的?
  • @JonathanLeffler 我正在以 root 身份运行我的 c 函数。
  • 您尝试运行的服务脚本的开头是否有#!...?脚本上是否设置了可执行位?

标签: c linux fork execvp


【解决方案1】:

尝试过

mycmd("/etc/rc.common", 2, "/etc/init.d/sysntpd", "start"); 

它有效。

【讨论】:

  • 它有效,但我没有任何解释。任何人都可以解释为什么它适用于该命令但它不适用于其他命令?
  • 你写的是/etc/rc.common,还是系统提供的?您正在使用哪种 Linux 变体?
  • 我问了哪一个,你说“它是一个”(含蓄地说,“我不会告诉你哪一个”,虽然我不知道为什么不告诉你)。 Linux 的管理很容易出现差异——我不知道它们目前在/etc/init.d 区域是否都相同,但从历史上看,在任何给定时间,Linux 变体之间肯定存在差异。因此,信息可能是相关的。而且您没有回答“您是编写/etc/rc.common 脚本还是系统提供的?”问题。
  • @JonathanLeffler 系统提供
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 2015-01-24
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多