ВВЕДЕНИЯ UX Как часть моей курсовой работы я пишу свою собственную оболочку в Linux. У меня проблема с размещением некоторых процессов в фоновом режиме. Я знаю, что размещение «&» в конце команды сохраняет процесс в фоновом режиме, а родительский процесс (myShell) не должен ждать его. Это отлично работает с Ls -l &, светлячок & и т.д.,положить кот в фоновом режиме замерзает мою оболочку
ПРОБЛЕМА
Проблема, с которой я действительно заинтересованное кошка &. Здесь, когда я запускаю эту команду, процесс cat переходит в фоновый режим, и я возвращаю приглашение myShell (родительский процесс), хотя я могу ввести, но myshell замерзает через несколько секунд.
У этого есть какое-либо отношение к блокировке ввода и т. Д., Любые предложения, пожалуйста? Благодарю.
EDIT: Вот функция от моего кода, который выполняет команду, определенную из моей оболочки, как спросил @minitech
void executeCmd(char **cmdArgs, int inRedirectFd, int outRedirectFd, char *inFileName, char *outFileName, int bgProc, int inPipe, int outPipe, int *pipeFd1, int *pipeFd2){
int childPid;
childPid = fork();
if(childPid==0){
//writing the pipes before the redirection because the redirection can overwrite pipes
if(!inPipe && outPipe){
close(pipeFd1[0]);
dup2(pipeFd1[1], STDOUT_FILENO);
}
else if(inPipe && !outPipe){
close(pipeFd1[1]);
dup2(pipeFd1[0], STDIN_FILENO);
}
else if(inPipe && outPipe){
close(pipeFd1[1]);
close(pipeFd2[0]);
dup2(pipeFd1[0], STDIN_FILENO);
dup2(pipeFd2[1], STDOUT_FILENO);
}
if(outRedirectFd==1){
//token = strtok(NULL, " ");
int fd = open(outFileName, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IROTH | S_IRGRP);
if(fd==-1){
printf("myShell: %s: %s\n", cmdArgs[0], strerror(errno));
}
dup2(fd, STDOUT_FILENO);
}
if(inRedirectFd==0){
//token = strtok(NULL," ");
int fd = open(inFileName, O_RDONLY | O_APPEND, S_IRUSR | S_IWUSR | S_IROTH | S_IRGRP);
if(fd == -1){
printf("myShell: %s: %s\n", cmdArgs[0], strerror(errno));
}
dup2(fd, STDIN_FILENO);
}
execvp(cmdArgs[0], cmdArgs);
printf("myShell: %s: %s\n", cmdArgs[0], strerror(errno));
_Exit(EXIT_FAILURE);
}
else{
if(!bgProc){
int retStatus;
waitpid(childPid, &retStatus, 0);
//waitpid(childPid, &retStatus, 0);
//printf("%d\n", retStatus);
}
else{
//printf("parentDesn't Wait");
}
}
}
Выбросьте любые другие предложения, которые вы могли бы думать. Спасибо.
Не могли бы вы показать свой код, пожалуйста? – Ryan