分离过程以在C中启动Firefox

问题描述

此C程序的目的是使我更轻松地打开对应于我在学校的每个班级的网站。当我在终端(kitty)中运行代码时,该代码通常可以正常运行,但是当我将其绑定到密钥时,该代码将失败。

我在Linux上,并且使用XFCE4的认keybind实用程序绑定密钥。我的键盘绑定在终端仿真器kitty中打开可执行文件

在我的设置中,我将PageUp绑定到以下命令:

kitty bash -c "/home/carter/Code/classes/classes"

它应按顺序执行以下操作:

  1. 显示我可以选择的课程列表
  2. 询问1-7之间的数字
  3. 在firefox中打开相应类的链接
  4. 停止执行并允许小猫咪关闭

这是代码(为匿名起见,我将链接和类名更改为示例):

#include <stdio.h>
#include <string.h>

int main() {
    char classNames[7][15] = {"Class 1","Class 2","Class 3","Class 4","Class 5","Class 6","Class 7"};
    char classLinks[7][60] = {"http://class1.com","http://class2.com","http://class3.com","http://class4.com","http://class5.com","http://class6.com","http://class7.com"};
    
    for (int i = 0; i < sizeof(classNames)/15; i++) { // 15 bytes to each string
        printf("%d) ",i+1);
        printf(classNames[i]);
        printf("\n");
    }

    int classIndex;
    printf("\nClasses to open: ");
    
    scanf("%d",&classIndex);  

    char cmd[70];

    strcpy(cmd,"firefox ");
    strcat(cmd,classLinks[classIndex-1]);
    //strcat(cmd," &"); // spawn new process ?
    
    printf(cmd);
    printf("\n");

    system(cmd);
    //popen(cmd,"w") // ???
}

这是我尝试过的一些事情(请记住,我很确定直接在终端中执行它们时所有这些工作。当我尝试将可执行文件绑定到键时它们会中断):

  1. 使用firefox {URL}system()格式运行命令

这似乎起初是可行的,但是在执行完代码后,它使我的终端窗口保持打开状态。当我关闭小猫时,它关闭了Firefox。

  1. firefox {URL} &格式运行它以使用system()生成新进程

这不起作用。它显示类并正确读取我的输入,但是此后什么也没做。 Firefox无法打开,小猫也会关闭

  1. popen("firefox {URL}","w")一样运行它

当我这样做时,我得到的结果与#2相同。

我正在尝试进行某种系统调用,以正确生成新的firefox进程。知道发生了什么吗?对不起,所有这些背景信息。

解决方法

没关系。经过一番摆弄,我找到了一个对我有用的解决方案。

我最终使用带有resources/public/index.html标志的setsid命令:

f