C 使用管道重定向来自';seq';输入';awk&x27;
在子进程中,我调用C 使用管道重定向来自';seq';输入';awk&x27;,c,unix,process,pipe,posix,C,Unix,Process,Pipe,Posix,在子进程中,我调用seq,将1作为第一个参数,将第一个命令行参数作为第二个参数。然后我继续使用seq的stdout作为第二个命令awk的输入。该命令获取第二个命令行参数作为参数。错误检查与此任务无关,因此请专注于功能 最后,awk的输出应打印在标准输出上 它将模拟如下内容:seq 110 | awk{printf} 这就是我走了多远,但我没有得到任何输出: #define READ 0 #define WRITE 1 int main(int argc, char *argv[]) { in
seq
,将1
作为第一个参数,将第一个命令行参数作为第二个参数。然后我继续使用seq
的stdout作为第二个命令awk
的输入。该命令获取第二个命令行参数作为参数。错误检查与此任务无关,因此请专注于功能
最后,awk
的输出应打印在标准输出上
它将模拟如下内容:seq 110 | awk{printf}
这就是我走了多远,但我没有得到任何输出:
#define READ 0
#define WRITE 1
int main(int argc, char *argv[]) {
int fd1[2];
if (pipe(fd1)==-1){
fprintf(stderr, "Pipe Failed");
return -1;
}
int pidSeq = fork();
if(pidSeq == 0){
close(fd1[READ]);
dup2(fd1[WRITE], 1);
close(fd1[WRITE]);
execl("seq", "seq", "1", argv[1], NULL);
}
else if(pidSeq > 0){
close(fd1[WRITE]);
dup2(fd1[READ], 0);
close(fd1[READ]);
execl("awk", "awk", argv[2], NULL);
}
return 0;
}
使用execlp()
而不是execl()
如前所述,它仅在当前目录同时包含seq
和awk
时才起作用
请注意,如果您在execl()
函数返回时报告了一个错误(并且它们只在出错时返回;如果成功则不返回),那么您就不需要询问就知道发生了什么错误
这是您的代码的固定版本。它使用GitHub上my(Stack Overflow Questions)存储库中的一些代码作为子目录中的文件stderr.c
和stderr.h
。这简化了错误报告
#include <stdio.h>
#include <unistd.h>
#include "stderr.h"
#define READ 0
#define WRITE 1
int main(int argc, char *argv[])
{
err_setarg0(argv[0]);
if (argc != 3)
err_usage("max 'awk script'");
int fd1[2];
if (pipe(fd1) == -1)
err_syserr("failed to create a pipe: ");
int pidSeq = fork();
if (pidSeq == 0)
{
close(fd1[READ]);
dup2(fd1[WRITE], 1);
close(fd1[WRITE]);
execlp("seq", "seq", "1", argv[1], NULL);
err_syserr("failed to exec 'seq': ");
}
else if (pidSeq > 0)
{
close(fd1[WRITE]);
dup2(fd1[READ], 0);
close(fd1[READ]);
execlp("awk", "awk", argv[2], NULL);
err_syserr("failed to exec 'awk': ");
}
else
err_syserr("failed to fork(): ");
return 0;
}
我首先使用了一个带有execl()
的版本,而不是execlp()
。我得到的结果是:
$ seq-awk59 15 '{sum += $1}END{print sum}'
seq-awk59: failed to exec 'awk': error (2) No such file or directory
seq-awk59: failed to exec 'seq': error (2) No such file or directory
$
误用程序会产生使用信息:
$ seq-awk59 a b c
Usage: seq-awk59 max 'awk script'
$
如果有问题,错误检查总是很重要的。如果没有问题,您有时可以在没有错误检查的情况下生存下来。如果您有问题,可能是您没有检查的错误之一。我想了解如何将一个命令的输出传递到另一个命令的输入的原理。就这么简单。我知道在编写一个真正的应用程序时,错误检查很重要,但我不希望这里的答案偏离我正在努力解决的功能点。我会再说一遍,因为我认为你不会第一次读到我的评论:如果你有问题,错误检查总是很重要的。如果没有问题,您有时可以在没有错误检查的情况下生存下来。如果您有问题,可能问题是您没有检查的错误之一。可能问题不是因为错误。但问题可能是您没有检查的错误之一。那么我的示例中的函数过程正确吗?如果你有Unix管道和c编程的知识,你应该能够告诉我我对这个任务的想法是否正确,是吗?这会很有帮助,因为如果函数过程是正确的,那么我们可以查看错误检查。如果功能过程已经错误,我们不需要浪费时间检查错误,因为整个程序都不会做它应该做的事情。
$ seq-awk59 a b c
Usage: seq-awk59 max 'awk script'
$