通过C打开申请

时间:2015-01-24 21:40:59

标签: c linux ubuntu-14.04

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

我尝试了以下命令,但在这两种情况下,C程序仍处于活动状态......

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

谢谢!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 编辑!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! p>

我根据您的评论尝试了此命令,但没有成功:

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。 这太令人沮丧......: - (

1 个答案:

答案 0 :(得分:0)

您需要将程序本身的文件名添加到参数列表(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,但这应该让你开始。