Я пишу оболочку на C. В оболочке есть внутренние и внешние команды.Внешние команды могут быть расширены с помощью амперсанда (&), поэтому они выполняются в фоновом режиме.
Когда я набираю, например, program&
, program
выполняется без проблем в фоновом режиме, делая оболочку доступной, покапрограмма выполняется.
Но вывод program
может смешиваться с обычным выводом оболочки.И это то, что я пытаюсь исправить, но безуспешно.
Примечание. В приведенном выше примере я говорил о program
как о любой другой команде.program
в основном спит, а затем печатает «Привет, мир!».Кроме того, «программа» находится в / bin /, который является моим каталогом внешних команд по умолчанию.
sish> pwd
[current directory]
sish> program&
sish> [now if I don't type anything...] Hello, World!
[now the current command is being written here].
Например, в bash это поведение отличается, кажется, что если пользователь «все еще»При написании команды вывод фоновой программы удерживается (или ожидает), поэтому пользователь может выполнить программу.Следовательно, не связываясь с выводом.
Я прочитал немного о сигналах, я попытался настроить обработчик сигналов, который печатал что-то на SIGCHLD, но у него также было то же поведение.
CODE:
while(1) {
int internal=0;
int background=0;
int redirect=0; // 1 - output ; 2 - input
// those variables are not important for the question
printf("sish> ");
fgets(command,BUFFER_SIZE,stdin);
}
... (некоторые строки, которые не важны для вопроса)
child = fork(); // pid_t child -> global variable
if(!child) {
if(redirect==1) {
int fd = open(words[2],O_WRONLY|O_CREAT|O_TRUNC,0660);
dup2(fd,1);
execlp(words[0],words[0],NULL);
}
else if(redirect==2) {
int fd = open(words[2],O_RDWR);
dup2(fd,0);
execlp(words[0],words[0],NULL);
}
else {
if(execvp(bin_path,words)==-1) {
printf("Error! Does the program exist?\n");
}
}
}
ПРИМЕЧАНИЯ: - Я ЗНАЮ, ЧТО Я НЕ ПРОВЕРЯЮ ОШИБКИ В ВИЛКЕ, Я ДОБАВЛЮТО, КОГДА Я РЕШАЮ ЭТУ ЖУКУ.- Я также напечатал STDERR с perror
, я ничего не получил.
Я ожидаю этого (например):
sish> pwd
[current directory]
sish> program&
sish> [I wait...] pwd
[current directory]
Hello, World!