Есть ли способ предотвратить запись фонового процесса в канал stdout, когда оболочка читает команду? - PullRequest
0 голосов
/ 28 сентября 2019

Я пишу оболочку на 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...