我正在尝试编写一个程序,它需要 n 个进程并将每个父进程的输出传递给子进程的输入。
我想问题在于关闭管道。
输入的一个示例是: ./a.out "ps ufax" "grep color" "sort -n" 预期输出:colord 2013 0.0 0.1 279216 4580 ? Sl 08:01 0:00 /usr/lib/x86_64-linux-gnu/colord/colord zabsa90 2525 0.0 0.0 9392 920 pts/2 S+ 08:26 0:00_grep 颜色
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include "log.h"
#define PROGRAM_NAME "IPC.log"
void parse( int position ,char *argv[] ,char *commands ,char *argument[]) ;
void handler(int sig) {
void *array[10];
size_t size;
// get void*'s for all entries on the stack
size = backtrace(array, 10);
// print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, 2);
exit(1);
}
int main(int argc ,char * argv[])
{
signal(SIGSEGV, handler);
if (argc == 1)
{ printf("Errore. Inserire almeno un argomento per il corretto funzionamento. Esempio: %s pwd\n", argv[0]);
exit(EXIT_FAILURE);
}
int number_process = argc-1;
int pipe_number = argc*2;
int pfd[pipe_number];
char command[30];
char *argument[1040];
int child = 0;
int parent = 0;
int count =0;
int pid ;
argc--;
while(child < number_process && parent < 1)
{
pipe(pfd+count);
pid=fork();
if ( pid == 0 )
{
// close(pfd[count] );
dup2(pfd[count+1], 1 );
count +=2;
parent ++;
argc--;
}
else
{
parent++;
wait(&pid);
// close( pfd[count+1] );
dup2( pfd[count], 0 );
parse( argc, argv ,command ,argument);
// execvp(commands,argument);
}
}
return 0;
}
void parse(int position ,char *argv[] ,char *command ,char *argument[] ) // parse the command line : store the command in a String and the
// and the arguments in array string
{
char *result = NULL ;
char buffer [30] ;
int count =0;
strcpy(buffer,argv[position]);
result =strtok(buffer," ");
strcpy(command,result);
while(result !=NULL )
{
argument[count] =result ;
result=strtok(NULL," ");
count++;
}
execvp(command,argument);
}
谢谢 :)