通过 C 打开应用程序
Opening an application via C
我正在尝试编写一个简单的 C 程序,它执行 Python 脚本(并让它 运行...)并自行关闭。
我尝试了以下命令,但在这两种情况下,C 程序仍然存在...
popen("sudo python /home/pi/main.py", "r");
system("sudo python /home/pi/main.py");
谢谢!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
编辑了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我根据您的评论尝试了此命令但没有成功:
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);
}
结果:它打印 am I here 并且没有启动 python。
太令人沮丧了.... :-(
您需要将程序本身的文件名添加到参数列表 (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
,但这应该可以帮助您入门。
我正在尝试编写一个简单的 C 程序,它执行 Python 脚本(并让它 运行...)并自行关闭。
我尝试了以下命令,但在这两种情况下,C 程序仍然存在...
popen("sudo python /home/pi/main.py", "r");
system("sudo python /home/pi/main.py");
谢谢!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 编辑了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我根据您的评论尝试了此命令但没有成功:
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);
}
结果:它打印 am I here 并且没有启动 python。 太令人沮丧了.... :-(
您需要将程序本身的文件名添加到参数列表 (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
,但这应该可以帮助您入门。