我试图编写一个在ubuntu终端中运行的程序。该程序将打开一个新的gnome终端,并在该新终端中运行命令,使用vim打开新的abcd.txt。然后,当我在运行程序的第一个终端中Ctrl+C时,新的gnome终端将关闭vim,并在第一个终端中发布公告
我试过system("`gnome-terminal`<< vim abcd.txt");
和这个system("vim abcd.txt>>`gnome-terminal`");
但是新的一个终端不能接收命令
我的完整代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
int loop=1;
void DEF()
{
system("kill -9 pidof vim");
loop=0;
}
void *subthreads(void *threadid)
{
loop=1;
long tid;
tid=(long)threadid;
system("`gnome-terminal`<< vim abcd.txt");
signal(SIGINT,DEF);
while(loop){}
pthread_exit(NULL);
}
void main()
{
int loop=1;
pthread_t threads;
int check;
long tID;
check= pthread_create(&threads,NULL,&subthreads,(void*)tID);
while(loop){}
printf("Ctrl+C is pressed!n");
}
不确定你最终想要实现什么。但这里有一些想法,从你的代码开始:
-
终端命令(在system((中(应该像Mark Setchell指出的那样,比如
system("gnome-terminal -e vim file.txt");
-
system((命令阻止了代码的进一步执行,因此在终止system((调用之前,不会调用
signal()
。 -
pidof
无法在我的Linux系统上运行。我会使用pkill <program>
。不过,这会杀死所有正在运行的实例,例如vim或您的终端。 -
您首先在全局作用域中声明变量
loop
,然后在main((中重新声明它。如果您真的想把它用作全局变量,那么它应该只是main((中的loop=1
。 -
您没有将变量
tid
用于任何用途。
这是程序的改进版本,添加了额外的printf调用来向用户解释发生了什么。我还使用了xterm和nano,因为我没有gnome终端,而且我不想干扰我运行的vim实例。但这可能仍然不是你想要做的。主要问题是system("xterm -e sh &")
正在阻塞,当你按下Ctrl-C时,系统调用将终止xterm,这样以后调用def((函数时就什么都不做了。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
int loop = 1;
void def()
{
printf("In defn");
system("pkill xterm");
loop=0;
}
void *subthreads(void *threadid)
{
printf("Starting subthreadn");
loop = 1;
long tid;
tid = (long)threadid;
signal(SIGINT, def);
system("xterm -e sh -c nano &"); // Note: xterm will still exit when you press Ctrl-C
printf("Terminal exited in subthreadn");
while (loop);
printf("Exited loop in subthreadn");
pthread_exit(NULL);
}
void main()
{
pthread_t threads;
int check;
long tID;
check = pthread_create(&threads, NULL, &subthreads, (void*)tID);
printf("In main after thread creationn");
while (loop);
printf("Ctrl+C is pressed!n");
}
另一种选择是使用fork((而不是pthread来拆分为一个单独的进程。(请注意,进程就像单独的应用程序,而线程是同一应用程序中的处理器线程。(
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void def()
{
system("pkill nano");
printf("def(): Killed nanon");
}
int subprocess()
{
signal(SIGINT, def);
pid_t parent_id = getpid(); // Get process ID of main process
fork(); // Fork into two identical copies of the running app.
if (getpid() != parent_id) { // The part in the if block is only done in the second process!
system("xterm -e sh -c nano &");
printf("subprocess(): system call ended in forked processn");
exit(0);
}
}
int main()
{
subprocess();
printf("Entering while loop in main processn");
while (1);
printf("Exited main threadn");
}
此版本的一个缺陷与上一个相同:当按下Ctrl-C时,xterm/nano将被杀死,def((随后将不执行任何操作,只捕获随后执行的任何Ctrl-C。
如果你进一步解释你的最终目标是什么,也许我可以给你一些建议。比如,为什么你想从C应用程序在终端中启动vim,然后杀死vim?你想杀死整个终端还是只杀死vim?