2016-12-12 3 views
0

Я работаю над системой трубопроводов со строкой в ​​C. Например, я пишу эту строку на консоль ./pipeline LOWERCASE REVWORD SQUASHWS < stringFile.txt. Он должен быть таким, как P0 -> P1 -> P2 -> ...-> Pn. P0 загрузите строку из файла stringFile.txt и отправьте ее на P1 .. Я могу работать с трубой (отправлять и читать), но я не знаю, как работать с N процессами. Это должно быть так. Можете ли вы дать мне какие-либо советы или примеры? СпасибоТрубопроводная система со строкой

while(is_something_to_read) { 
    load_from_previous_process(); 
    do_process(); // for example LOWERCASE 
    send_to_next_process(); 
} 

ответ

0

Patrik,

Я написал программу, которая имитирует оболочку, которая будет порождать определенное количество детей, и каждый процесс будет взаимодействовать с другим процессом. Поскольку количество процессов может меняться, я решил использовать 2D-массив для труб. В приведенном ниже коде NUM_PROCS относится к количеству процессов, которые будут выполняться (включая родителя).

Я объявляю его

int pipes[NUM_PROCS][2]; 

После этого я создаю трубы

for(i = 0; i < NUM_PROCS; i++) 
{ 
    if((pipe(pipes[i])) < 0) 
    { 
     perror("Failed to open pipe"); 
    } 
} 

Это программа-оболочка, которую я написал для практики.

#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <fcntl.h> 

#define MAXARGS 256 
char ** getargs(char * cmd) { 
     char** argsarray; 
     int nargs = 0; 
     int nlen = strlen(cmd); 
     int i = 0; 
     argsarray = (char**) malloc(sizeof(char*) * MAXARGS); 
     argsarray[0] = strtok(cmd," "); 
     i = 0; 
     while (argsarray[i] != NULL){ 
       i++; 
       argsarray[i] = strtok(NULL," "); 
     } 
     return argsarray; 
} 


int main(void){ 

    pid_t childpid; 
    int fd[256][2]; 
    char cmd[256]; 
    char * sepCmd[256]; 
    char * pch; 

    printf("Please enter a command sequence: \n"); 
    gets(cmd); 
    printf("You have entered: %s ....%d\n", cmd,strlen(cmd)); 


    printf("Attempting to split up command: \n"); 
    pch = strtok (cmd, "|"); 
    int count = 0; 
    while (pch != NULL && count < 256) { 
     printf("%s\n", pch); 
     sepCmd[count] = pch; 
     printf("The value in this array value is: %s\n", sepCmd[count]); 
     pch = strtok (NULL, "|"); 
     count++; 
    } 

    char ** argue; 
    int k; 

    /* Block that deals with the first command given by the user */ 
    k = 0; 
    pipe(fd[k]); 
    if(!fork()) { 
       dup2(fd[k][1], STDOUT_FILENO); 
       close(fd[k][0]); 
       argue = getargs(sepCmd[k]); 
       execvp(argue[0], argue); 
       perror(argue[0]); 
       exit(0); 
    } 

    /*Loop that will control all other comands except the last*/ 
    for(k = 1; k <= count - 2; k++) { 
      close(fd[k-1][1]); 
      pipe(fd[k]); 

      if(!fork()) { 
        close(fd[k][0]); 
        dup2(fd[k-1][0], STDIN_FILENO); 
        dup2(fd[k][1], STDOUT_FILENO); 
        argue = getargs(sepCmd[k]); 
        execvp(argue[0], argue); 
        perror(argue[0]); 
        exit(0); 
      } 
    } 
    /*Block that will take care of the last command in the sequence*/ 
    k = count - 1; 
    close(fd[k-1][1]); 
    if(!fork()) { 
      dup2(fd[k-1][0], STDIN_FILENO); 
      argue = getargs(sepCmd[k]); 
      execvp(argue[0], argue); 
      perror(argue[0]); 
      exit(0); 
    } 
    while(waitpid(-1, NULL, 0) != -1); 
} 
+0

Можете ли вы показать мне пример, как он работает? – PatrikD

+0

@PatrikD, как только вы скомпилировали свою программу, вы получите a.out. запустите этот исполняемый файл. вам будет предложено «Пожалуйста, введите последовательность команд:», затем дайте ps -aux или любую команду оболочки –

+0

Okey работает, но я не знаю, как обрабатывать процесс, например p1-процесс LOWERCASE, а затем отправить P2-процесс REVWORD. Это возможно с вашим примером? – PatrikD

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