2013-11-12 4 views
7

им в настоящее время, реализующий оболочки в С. Моя проблема возникает, когда я пытаюсь запустить такую ​​команду:реализации оболочки в C

SHELL$: sort < txtFile | grep key 

им работает sort < txtFile в процессе (ребенок), и в родительский то есть else if(pid > 0) им управляет другая команда справа от трубы.

Программа работает нормально, но она выходит из бесконечного цикла, который я создал в основном, чтобы получать вход от пользователя.

Как я могу решить эту проблему?

это код, я до сих пор иметь дело с трубой, я не включаю в себя код, который я должен иметь дело с редиректами:

c2p является установкой трубы я для этого.

if(pid == 0) 
{ 
    if(PIPE_FLAG) 
    { 
     close(c2p[0]); 
     if(dup2(c2p[1], STDOUT_FILENO) == -1){ 
      perror("dup2() failed"); 
      exit(2); 
     } 
    } 

    /* Execute command */ 
    execvp(cmd_args[0], cmd_args); 
    perror("exec failed 1. ");   /* return only when exec fails */ 
    exit(-1); 

} 
else if(pid > 0) 
{ 
    if(PIPE_FLAG) 
    { 
     close(c2p[1]); 
     if(dup2(c2p[0], STDIN_FILENO) == -1){ 
      perror("dup2() failed"); 
      exit(-1); 
     } 
     execvp(nxt_args[0], nxt_args); 
     perror("exec failed 2. ");   
     exit(-1);  
    } 
} 
else 
{ 
    /* error occurred */ 
    perror("fork failed"); 
    exit(1); 
} 
+0

@KerrekSB благодарит за ваш отзыв, но я пытаюсь выяснить, что происходит с моим кодом. Большое спасибо за ответ, хотя – Hous3aholik

+0

Вы вызываете 'exec' как в родительском, так и в дочернем процессе, поэтому сама оболочка больше не существует. – chepner

ответ

4

Я бег sort < txtFile в дочернем процессе, и в родительском я бег команды справа от трубы.

Что происходит с процессом оболочки? Родительский процесс - это оболочка. Запустив правую команду в родительском процессе, вы имеете дело с процессом оболочки. Помните, что exec() заменяет текущий процесс.

Вам понадобится fork() два раза и выполнить две стороны трубы в дочерних процессах. Родитель должен оставаться оболочкой, которая будет ждать() для выхода детей перед представлением следующей командной строки.

+0

большой !! это тип информации, которую я искал. Поэтому, когда вы говорите, что мне нужно будет вилка дважды, это означает, что после выполнения первой команды = sort Hous3aholik

+0

Просто напишите функцию, которая принимает одну команду этапа конвейера (то есть, _either_ 'sort Useless

+0

@ Нужна дополнительная информация о том, как это сделать? – Hous3aholik

0
/* How shell works */ 
#include<stdio.h> 

#include<unistd.h> 

main (int argc, char **argv) 
{ 

    if (argc < 2) 
    { 

     fprintf (stderr, "\nUsage: ./a.out cmd [options]...\n"); 

    } 

    if (!fork()) 
    { 

     argv++; 

     execvp (argv[0], argv); 

    } 

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