新的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?