【问题标题】:Opening an application via C通过 C 打开应用程序
【发布时间】:2015-01-24 21:40:59
【问题描述】:

我正在尝试编写一个简单的 C 程序,它执行 Python 脚本(并让它运行...)并自行关闭。

我尝试了以下命令,但在这两种情况下 C PROGRAM 仍然存在...

popen("sudo python /home/pi/main.py", "r");
system("sudo python /home/pi/main.py");

谢谢!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 已编辑!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

我根据你的 cmets 尝试了这个命令,但没有成功:

char *argv[] = {"/home/pi/main.py"};
execv("sudo python", argv);

有人可以帮忙吗?谢谢!

!!!!!!!!!!!!编辑 2 !!!!!!!!!!!!!!!

我是这样编译的:

gcc -Wall restart.c -o safekill

这是C程序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

my_popen(char cmd[])
{
    FILE *fp;
    char path[1035];

    fp = popen(cmd, "r");

    if (fp == NULL)
    {
        printf("Failed to run command\n");
        exit(1);
    }

    //Read the output a line at a time - output it
    while (fgets(path, sizeof(path)-1, fp) != NULL)
    {
        printf("%s", path);
    }

    pclose(fp);

}

int main()
{
    my_popen("sudo killall python");
    sleep(1);
    my_popen("sudo killall raspivid");
    sleep(1);

    if(fork())
        printf("Am I here?");
        return 0;

    char *file = "restart";
    char *argv[] = {file, "-c", "sudo python main.py", NULL};
    execvp(file, argv);
}

结果:它打印我在这里,但没有启动 python。 真是令人沮丧.... :-(

【问题讨论】:

  • exec?
  • 您不是打开应用程序,而是执行程序。请参阅execve(2)exec(3) 并阅读Advanced Linux Programming
  • @BasileStarynkevitch 虽然您在技术上是正确的,但命令名称 popen 似乎不同意您的意见。
  • popen(3) - 库函数,而不是命令- 正在打开管道流; p 用于“管道”(参见pipe(7)...)而不是“程序”。
  • 顺便说一句,您可能仔细阅读setuid以避免sudo

标签: c linux ubuntu-14.04


【解决方案1】:

您需要将程序本身的文件名添加到参数列表 (argv[0]) 并使用 NULL 指针终止参数列表。

例子:

#include <stdlib.h>
#include <unistd.h>

int main() {
    if(fork())
        return 0;
    char *file = "python";
    char *argv[] = {file, "-c", "import time; time.sleep(5); print 'Hello'", NULL};
    execvp(file, argv);    
}

预期行为:立即(父)程序终止,并在 5 秒后由子程序打印一个简短的 Hello

也许您需要以某种方式解决sudo,但这应该可以帮助您入门。

【讨论】:

  • 感谢您的帮助,但不幸的是它不起作用。我用步骤和结果编辑了问题。谢谢!
  • @user1688175 您可能想要检查 exec 命令的返回值。也许strerror(errno); 在这种情况下会有所帮助。但我认为找到将重新启动 python 脚本的确切命令毕竟超出了这个问题的范围。一旦你完成了这一步,你可能想发布另一个问题。
猜你喜欢
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多