Создание нового терминала и открытие vim

#c #c #fork #xterm

#c #c #форк #xterm

Вопрос:

Чего я пытаюсь добиться, так это открыть новый терминал из программы на C / C и запустить vim. Я делаю это путем разветвления и выполнения «xterm -e vim [fname]». Как я ни стараюсь, я не могу заставить xterm понять, что я хочу, чтобы он делал.

Ниже приведен соответствующий сегмент кода:

     int pid = fork();
    if (pid){
        //parent
        int retstat;
        waitpid (pid, amp;retstat, 0);
    }else{
        //child
        
        char* ifname_cchararr = (char*)malloc(ifname.length()   1);
        strcpy (ifname_cchararr, ifname.c_str());
        char* const argv[4] = {"-e", "vim", ifname_cchararr, NULL};
       // std::cout << ifname_cchararr<<std::endl;
        execvp ("xterm", argv);
    }
  

Запуск программы приводит к жалобе xterm:

-e: явная оболочка уже была /usr/bin/vim

-e: неверная опция командной строки «testfile»

У меня такое чувство, что я как-то перепутал argc, но я в замешательстве, потому что запускаю следующее в окне xterm:

xterm -тестовый файл vim

работает отлично.

Пожалуйста, просветите меня!

Комментарии:

1. Добавьте xterm в качестве первого аргумента к вашему argv .

2. @tkausl о, дорогой мне. я думал, что это уже обработано функцией. какая глупая ошибка. можете ли вы дать короткий ответ, чтобы я мог принять и поддержать его?

Ответ №1:

Вы забыли добавить xterm в качестве первого аргумента argv . Может показаться немного странным, что вам нужно добавить program-name argv , поскольку вы уже указываете execvp , какую программу вы вызываете, но так оно и есть. Для получения дополнительной информации о том, почему, см. Этот недавно заданный вопрос в Unix и Linux: почему argv включает имя программы