新的gnome终端如何在C中接收命令



我试图编写一个在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?

相关内容

  • 没有找到相关文章

最新更新