Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用管道重定向来自';seq';输入';awk&x27;_C_Unix_Process_Pipe_Posix - Fatal编程技术网

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'
$