c - 使用 fork 和 execvp 启动/停止/etc/init.d/中的服务不起作用

标签 c linux fork execvp

为了从我的 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)。

最佳答案

尝试过

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

而且有效。

关于c - 使用 fork 和 execvp 启动/停止/etc/init.d/中的服务不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32565350/

相关文章:

c - PThreads.消费者-生产者!打印在不同的文件中

c - 这段代码有什么问题?

c - 整数提升、值位和乘法

Java Glassfish 4 崩溃并显示 "double free or corruption (fasttop)"

c - 获取外部进程的 CPU 时间,并在它仍在 OS X 上运行时获取它的子进程

linux - 如何附加到幽灵 screen session ?

perl - Perl 中的 Fork 无法在从文件读取的 while 循环内工作

linux - 如果某个进程从setuid二进制叉开始,并且子进程放弃了特权,那么仍可以信任该子进程吗?

c - 动态分配 vector C

c - 使用 fork() 和 exec() 在 C 中执行命令行管道