2015-10-07 2 views
0

ВВЕДЕНИЯ 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"); 
    } 
} 

}

Выбросьте любые другие предложения, которые вы могли бы думать. Спасибо.

+0

Не могли бы вы показать свой код, пожалуйста? – Ryan

ответ

5

Когда cat вызывается без аргумента файла, он обрабатывает stdin. Когда вы используете cat &, он переходит в фоновый режим и ждет ввода от stdin. Поскольку вы не предоставляете способ сигнализации конца stdin, он ждет навсегда.

Если вы предоставите файл cat, как в cat test.txt &, он не заморозит вашу оболочку.

Смежные вопросы