Я создаю простую оболочку в Linux, и у меня возникают проблемы с получением команды для запуска в фоновом режиме.
вот мой код до сих пор:
create command,argv and check if it is to be ran in the background &
enter this code:
if(strcmp(command,"cd")==0)
{
chdir(argv[1]);
}
else if(strcmp(command,"clr") == 0)
{
if ((pid = fork()) == 0)
{
execvp("clear",argv);
}
wait(&status);
}
else
{
if ((pid = fork()) == 0)
{
execvp( prog, argv );
}
wait(&status);
}
Команда и argv — это то, что я получаю от пользователя.
Мне нужно запустить команду в фоновом режиме, если ‘&’является последней частью команды. Я уже проверил это с помощью логического var bg. но у меня возникли проблемы с функцией WAITPID () я не уверен, куда он идет.
Я думаю, что ваша проблема, если вы в конечном итоге звоните waitpid()
непосредственно, вы будете блокировать, и процесс не работает в фоновом режиме. Вы можете справиться с этим двумя способами.
Выбор 1: избежать проблемы. После вызова fork один раз попросите дочернюю ветвь fork. Пусть внук выполнит команду, и пусть ребенок выйдет. Родитель ожидает ребенка, как и раньше, но внук выполняет команду в фоновом режиме. Процесс внука будет пожинаться init
процесс.
Вариант 2: обратите внимание на асинхронное уведомление о том, что дочерний элемент выполнен. Когда дочерний процесс умирает, родительский процесс получит SIGCHLD
сигнал. Пусть обработчик сигнала заметит этот сигнал и пожнет ребенка. Это может потребовать, чтобы вы реструктурировали свой код так, чтобы синхронные официанты фактически получали синхронное уведомление от вашего обработчика сигнала. Тогда вам понадобится механизм для обработчика сигнала, который будет различать дочерние объекты на переднем и заднем плане и отправлять только синхронные уведомления для дочерних объектов на переднем плане.
Других решений пока нет …