简体   繁体   中英

Pipeline system with string

I am working on pipeline system with string in C. For example I write this line to console ./pipeline LOWERCASE REVWORD SQUASHWS < stringFile.txt . It should be any like this P0 -> P1 -> P2 -> ...-> Pn. P0 load string from file stringFile.txt and send it to P1.. I can work with pipe(send and read), but I dont know how to work with N processes. It should be any like this. Can you give me any advice or example? Thank you

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

Patrik,

I wrote a program that simulate a shell that will spawn a given amount of children and each process will then communicate with another process. Since the number of processes can vary I decided to use a 2D array for the pipes. In the below code NUM_PROCS refers to the amount of processes that will be running (including the parent).

I declare it

int pipes[NUM_PROCS][2];

After this, I create the pipes

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

This is a shell program that i wrote for practise.

#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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM