Как правильно ждать процессов переднего плана / фона в моей собственной оболочке на C?
Это должно помочь вам начать signals работу. Основное отличие background-foreground состоит в том, что я избавился c от дочернего обработчика processes и добавил waitpid
в основной цикл process с некоторой обратной связью. Протестировано c и работает, но, очевидно, требуется background-foreground больше TLC.
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
int background;
ssize_t rBytes;
int aCount;
pid_t pid;
int status;
while(1) {
pid = waitpid(-1, &status, WNOHANG);
if (pid > 0)
printf("waitpid reaped child pid %d\n", pid);
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
rBytes = read(0, bBuffer, BUFSIZ-1);
if(rBytes == -1) {
perror("read");
exit(1);
}
bBuffer[rBytes-1] = '\0';
if(!strcasecmp(bBuffer, "exit"))
exit(0);
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
background = (strcmp(pArgs[aCount-2], "&") == 0);
if (background)
pArgs[aCount-2] = NULL;
if (strlen(pArgs[0]) > 1) {
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
execvp(pArgs[0], pArgs);
exit(1);
} else if (!background) {
pid = waitpid(pid, &status, 0);
if (pid > 0)
printf("waitpid reaped child pid %d\n", pid);
}
}
}
return 0;
}
РЕДАКТИРОВАТЬ: Добавить в обработку process сигналов несложно с помощью signals waitpid()
и WNOHANG. Это так же просто, как process переместить материал waitpid()
из background-foreground верхней части цикла в обработчик signals сигнала. Однако вы должны process знать о двух вещах:
Во-первых, даже signal процессы «переднего плана» будут c отправлять SIGCHLD. Поскольку processes может быть только один процесс process переднего плана, вы можете c просто сохранить pid переднего c плана (значение, возвращаемое processes родителем из fork()
) в переменной, видимой process обработчику сигнала, если signals вы хотите выполнить особую signal обработку переднего плана background-foreground по сравнению с фоном.
Во-вторых, в signals настоящее время вы выполняете background-foreground блокировку ввода-вывода для background-foreground стандартного ввода (read()
в верхней signal части основного цикла). С c большой вероятностью вы будете c заблокированы на read()
при возникновении c SIGCHLD, что приведет к прерыванию background-foreground системного вызова. В зависимости processes от ОС он может автоматически signals перезапустить системный вызов signal или отправить сигнал, который c необходимо обработать.
c
process
signals
background-foreground
Как правильно ждать процессов переднего плана / фона в моей собственной оболочке на C?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.