C принимает аргументы из командной строки в качестве условий

Я совершенно новичок в C... ну вроде как. я вроде знаю с++. Я пытаюсь запустить многопоточную программу для своего задания, и одно из требований состояло в том, чтобы пользователь вводил свои команды в командной строке. По сути, я спрашиваю, как я могу настроить int main, чтобы он мог постоянно принимать входные данные из командной строки (чтобы я мог запускать новые потоки) без остановки, и как делать сравнения, например, если пользователь нажимает «E ' сделайте это, если он нажмет F, сделайте то и так далее. Я предполагаю, что argc вообще не имеет значения, потому что я не знаю, сколько команд собирается ввести пользователь. Что было бы лучшим способом продолжить об этом


person user1665569    schedule 22.02.2013    source источник
comment
скажем, пользователь дважды нажимает e (затем создает 2 потока). Он вводит S, чтобы остановить все запущенные потоки и т. д.   -  person user1665569    schedule 22.02.2013


Ответы (4)


Пользовательский интерфейс-поток:

void *trd_func(void *p) {
  while (1) {
    int c = getchar();
    switch(c) {
        case 'E':
             set_some_flag('E');
             break;
        default: break;
    }
  }
  return 0;
}
person perreal    schedule 22.02.2013
comment
мне нужно вызывать это каждый раз, когда пользователь что-то вводит в командной строке? - person user1665569; 22.02.2013
comment
вам нужно посвятить поток, чтобы сделать это. тогда вы можете забыть об этом, поток будет непрерывно читать и обрабатывать ввод. - person perreal; 22.02.2013
comment
извините, но почему я должен начинать новый поток, это мой основной поток, и он будет управлять созданием других потоков, их запуском и так далее. нет ли способа сохранить это в этом основном потоке? - person user1665569; 22.02.2013
comment
я вижу, что преимущество этого заключается в том, что у меня всегда будет это работать, как вы сказали, и мне не придется об этом беспокоиться, но могу ли я объединить их и всегда проверять ввод или нет? извините за столько вопросов, но я просто пытаюсь понять это лучше - person user1665569; 22.02.2013
comment
вы можете иметь это в основной теме, конечно. Это также нить, и вы можете посвятить ее этой цели, что на самом деле имеет больше смысла. - person perreal; 22.02.2013
comment
Большое спасибо за Вашу помощь - person user1665569; 22.02.2013

Когда программа запускается, аргументы командной строки передаются в int main(int argc, char **argv) и не изменяются (если только программа их не изменяет).

После этого программа может читать из стандартного ввода, чтобы получить такие команды, как E для «сделать это» и F для «сделать то». Если вы не предпримете шаги для конкретной платформы, чтобы заставить ее вести себя иначе, входные данные не будут предоставлены вашей программе до тех пор, пока пользователь не нажмет return после ввода команды.

Таким образом, вы можете обрабатывать аргументы командной строки, если они предоставлены. Сделав это, вы можете перейти в интерактивный режим и дождаться дальнейших действий пользователя.

Многопоточность имеет к этому очень мало отношения. Вам, вероятно, понадобится один поток для чтения от пользователя (иначе кто-то или что-то запутается), но в остальном связь между потоками — это совершенно отдельная проблема.

person Jonathan Leffler    schedule 22.02.2013
comment
хорошо, это имеет смысл. так что я могу просто иметь int c = getchar(), как сказал @perreal, с оператором switch, который будет постоянно принимать значения, и мне не нужно их запрашивать? - person user1665569; 22.02.2013

Пусть главный поток отвечает за ввод-вывод.

  • Распечатайте приглашение пользователю для ввода из главного потока.

  • Передайте пользовательский ввод из главного потока в рабочие потоки.

  • Повторение.

person StoryTeller - Unslander Monica    schedule 22.02.2013

Если вы действительно хотите учиться, делая то, что хотите,

вам следует начать искать информацию о файловых потоках и о вводе ttys/canonical.

И когда вы поймете, как это работает, вы сможете использовать функцию read() и делать все, что хотите, для взаимодействия с пользователем (даже использовать оболочку).

Я могу гарантировать вам, что вы узнали много интересного о файловых потоках ввода/вывода.

Но, как упоминалось ранее, вы также можете использовать getchar().

person SeedmanJ    schedule 22.02.2013