2016-09-14 15 views
1

私は自分の関数をC言語で記述しようとしています。まず、フォークして子プロセスに入ったら、パイプがどこにあるのかを調べます。私は自分自身でStringArrayをループしています(sa)。そして、以前に初期化されたchar cmd1 [64]とchar cmd2 [64]の後のトークンにトークンをコピーします。 int配管には次のステップの値が与えられます。自分のパイプ機能をC言語で書く

if(strcmp(sa[i], "|") == 0) 
     { 
      printf("got to the pipe\n"); 
      sa[i]=NULL; 
      strcpy(cmd1, sa[i-1]); 
      strcpy(cmd2, sa[i+1]); 
      piping=2; 
     } 

その後、プログラムはこのステートメントに達する:

if (piping) 
{ 
    if (pipe(fd) != 0){ 
     perror("Failed to create pipe"); 
    } 
    if ((cpPid = fork()) == -1){ 
     perror("Failed to fork"); 
    } 
    if (cpPid == 0){ 
     dup2(fd[1], 1); 
     close(fd[0]); 
     close(fd[1]); 
     execvp(cmd1, sa); 
     error("failed to exec command 1"); 
    } 
    else 
    { 
     dup2(fd[0], 0); 
     close(fd[0]); 
     close(fd[1]); 
     execvp(cmd2, sa); 
     error("failed to exec command 2"); 
    } 
} 

私のプログラムが完全にクラッシュし、唯一の不明なエラー10275024.を与え、誰かが間違って起こっているかを把握するために私を助けることができますか?

+4

MCVEがなければ何も言うことはありません。 –

+0

私は宿題のために同じものを作った、これは私を助けたhttp://stackoverflow.com/questions/948221/does-this-multiple-pipes-code-in-c-makes-sense –

+0

@EugeneSh。 MCVEとは何ですか? –

答えて

0

あなたは、コードのパイプラインの例では、

あなたが任意のパイプラインを使用することができます

who | awk '{print $1}' | sort | uniq -c | sort -n

であるC.

#include <assert.h> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <memory.h> 
#include <errno.h> 

typedef int Pipe[2]; 

/* exec_nth_command() and exec_pipe_command() are mutually recursive */ 
static void exec_pipe_command(int ncmds, char ***cmds, Pipe output); 

static void err_vsyswarn(char const *fmt, va_list args) { 
    int errnum = errno; 
    vfprintf(stderr, fmt, args); 
    if (errnum != 0) 
     fprintf(stderr, " (%d: %s)", errnum, strerror(errnum)); 
    putc('\n', stderr); 
} 

static void err_syswarn(char const *fmt, ...) { 
    va_list args; 
    err_vsyswarn(fmt, args);; 
} 

static void err_sysexit(char const *fmt, ...) { 
    va_list args; 
    err_vsyswarn(fmt, args); 
    exit(1); 
} 

/* With the standard output plumbing sorted, execute Nth command */ 
static void exec_nth_command(int ncmds, char ***cmds) { 
    assert(ncmds >= 1); 
    if (ncmds > 1) { 
     pid_t pid; 
     Pipe input; 
     if (pipe(input) != 0) 
      err_sysexit("Failed to create pipe"); 
     if ((pid = fork()) < 0) 
      err_sysexit("Failed to fork"); 
     if (pid == 0) { 
      /* Child */ 
      exec_pipe_command(ncmds - 1, cmds, input); 
     } 
     /* Fix standard input to read end of pipe */ 
     dup2(input[0], 0); 
     close(input[0]); 
     close(input[1]); 
    } 
    execvp(cmds[ncmds - 1][0], cmds[ncmds - 1]); 
    err_sysexit("Failed to exec %s", cmds[ncmds - 1][0]); 
    /*NOTREACHED*/ 
} 
/* exec_nth_command() and exec_pipe_command() are mutually recursive */ 
/* Given pipe, plumb it to standard output, then execute Nth command */ 
static void exec_pipe_command(int ncmds, char ***cmds, Pipe output) { 
    assert(ncmds >= 1); 
    /* Fix stdout to write end of pipe */ 
    dup2(output[1], 1); 
    close(output[0]); 
    close(output[1]); 
    exec_nth_command(ncmds, cmds); 
} 

/* Execute the N commands in the pipeline */ 
static void exec_pipeline(int ncmds, char ***cmds) { 
    assert(ncmds >= 1); 
    pid_t pid; 
    if ((pid = fork()) < 0) 
     err_syswarn("Failed to fork"); 
    if (pid != 0) 
     return; 
    exec_nth_command(ncmds, cmds); 
} 

/* who | awk '{print $1}' | sort | uniq -c | sort -n */ 
static char *cmd0[] = {"who", 0}; 
static char *cmd1[] = {"awk", "{print $1}", 0}; 
static char *cmd2[] = {"sort", 0}; 
static char *cmd3[] = {"uniq", "-c", 0}; 
static char *cmd4[] = {"sort", "-n", 0}; 

static char **cmds[] = {cmd0, cmd1, cmd2, cmd3, cmd4}; 
static int ncmds = sizeof(cmds)/sizeof(cmds[0]); 

int main(int argc, char **argv) { 
    exec_pipeline(ncmds, cmds); 
    return (0); 
} 

を使用してパイプラインを実行するに役立つはず、この作業例を見てください。 。

テスト:

[email protected] ~/C/> 
who | awk '{print $1}' | sort | uniq -c | sort -n 
     1 dac 
[email protected] ~/C/> gcc main.c 
[email protected] ~/C/> ./a.out 
    1 dac 
関連する問題