新的gnome终端如何在C中接收命令
How can new gnome terminal receive command in C
我试图在 ubuntu 终端中编写 运行 的程序。程序将打开一个新的 gnome 终端,并在该新终端中使用 运行 命令打开新的 abcd.txt 使用 vim.And 然后当我在 运行 程序的第一个终端按 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() 中重新声明它。如果你真的想将它用作全局变量,它应该只是 loop=1
in main().
您没有将变量 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 def\n");
system("pkill xterm");
loop=0;
}
void *subthreads(void *threadid)
{
printf("Starting subthread\n");
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 subthread\n");
while (loop);
printf("Exited loop in subthread\n");
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 creation\n");
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 nano\n");
}
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 process\n");
exit(0);
}
}
int main()
{
subprocess();
printf("Entering while loop in main process\n");
while (1);
printf("Exited main thread\n");
}
这个版本的一个缺陷与前一个相同:当按下 Ctrl-C 时,xterm/nano 被终止并且 def() 随后除了捕获之后执行的任何 Ctrl-C 之外什么都不做。
如果你进一步说明你的最终目标是什么,也许我可以给一些建议。
比如,为什么要从 C 应用程序在终端中启动 vim 然后终止 vim?你想杀死整个终端还是只杀死 vim?
我试图在 ubuntu 终端中编写 运行 的程序。程序将打开一个新的 gnome 终端,并在该新终端中使用 运行 命令打开新的 abcd.txt 使用 vim.And 然后当我在 运行 程序的第一个终端按 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() 中重新声明它。如果你真的想将它用作全局变量,它应该只是loop=1
in main().您没有将变量
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 def\n");
system("pkill xterm");
loop=0;
}
void *subthreads(void *threadid)
{
printf("Starting subthread\n");
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 subthread\n");
while (loop);
printf("Exited loop in subthread\n");
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 creation\n");
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 nano\n");
}
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 process\n");
exit(0);
}
}
int main()
{
subprocess();
printf("Entering while loop in main process\n");
while (1);
printf("Exited main thread\n");
}
这个版本的一个缺陷与前一个相同:当按下 Ctrl-C 时,xterm/nano 被终止并且 def() 随后除了捕获之后执行的任何 Ctrl-C 之外什么都不做。
如果你进一步说明你的最终目标是什么,也许我可以给一些建议。 比如,为什么要从 C 应用程序在终端中启动 vim 然后终止 vim?你想杀死整个终端还是只杀死 vim?