你也可以做一個管道;看看命令是如何建立起來的,看到的結構,他們以0結束陣列和報價被剝離:
/* 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};*/
這裏有一些實用功能,當你創建帶有參數的管道。它們經過良好測試和無缺陷。
pipeline.c
#define _XOPEN_SOURCE 500
/* One way to create a pipeline of N processes */
#ifndef STDERR_H_INCLUDED
#define STDERR_H_INCLUDED
static void err_sysexit(char const *fmt, ...);
static void err_syswarn(char const *fmt, ...);
#endif /* STDERR_H_INCLUDED */
/* pipeline.c */
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include "openshell.h"
#include <errno.h>
/* exec_nth_command() and exec_pipe_command() are mutually recursive */
static void exec_pipe_command(int ncmds, char ***cmds, Pipe output);
/* 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*/
}
/* 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);
}
/* 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]);*/
/* Execute the N commands in the pipeline */
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);
}
#include <stdarg.h>
static const char *arg0 = "<undefined>";
static void err_vsyswarn(char const *fmt, va_list args) {
int errnum = errno;
fprintf(stderr, "%s:%d: ", arg0, (int) getpid());
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;
va_start(args, fmt);
err_vsyswarn(fmt, args);
va_end(args);
}
static void err_sysexit(char const *fmt, ...) {
va_list args;
va_start(args, fmt);
err_vsyswarn(fmt, args);
va_end(args);
exit(1);
}
代碼來自從那裏賞金被授予上面的代碼前面一個問題事先殼牌項目。已有詳細的答案 - How to fix these errors in my code。 C minishell: adding pipelines也包含了大部分引用代碼。
您還可以閱讀pipe(2),pipe(7)和Advanced Linux Programming
調臺的整個環境,只有當前目錄的名稱將會使一些程序不快取代它。這不是你怎麼做的 - 不管你想要做什麼。 –
一個典型的命令在內存中看起來像這樣:'static char * cmd1 [] = {「awk」,「{print $ 1}」,0};'注意引號被剝離並終止0. –