#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 включает имя программы