linux终端命令用c代码管道

时间:2017-01-31 21:35:10

标签: c linux command pipe

我试图执行Linux命令" ls -l |尾巴-n 2"使用c代码中的简单管道。

我添加了你的提示,现在这样可行,但输出并不完全正确。它将输出打印在一行而不是两行,并等待用户输入关闭。 这是新代码:

#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"
#include "sys/wait.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void main()
{
    char line[100];
    pid_t pid;
    int fd[2];
    int status;
    char* ls_arguments[] = {"ls", "-l", NULL};
    char* tail_arguments[] = {"tail", "-n", "2", NULL};
    pipe(fd);
    pid = fork();
    if(pid == 0)//ls client
    {
        close(1);
        dup(fd[1]);
        close(fd[0]);
        execvp("ls", ls_arguments);
    }
    pid = fork();
    if(pid == 0)//tail client
    {
        close(0);
    close(fd[1]);
        dup(fd[0]);
        execvp("tail", tail_arguments);
    }
    wait(pid, 0, WNOHANG);
    close(fd[0]);
    close(fd[1]);
}

这应该运行&#34; ls -l&#34;命令和输出到管道和下一个&#34;尾部&#34;客户端会将其作为输入并运行&#34; tail -n 2&#34;命令并打印出最终输出,但终端不打印任何内容。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

首先,没有wait这样的功能,这是man所说的内容:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

我认为您打算使用waitpid

然后,您的子进程无法完成,因为管道仍在某处:在父级中打开。实际上,您应首先关闭描述符,然后等待您的孩子进程。我会写:

  close(fd[0]);
  close(fd[1]);
  wait(NULL); // Wait for the first child to finish
  wait(NULL); // Wait fot the second one
  return 0;
}

而不是:

  wait(pid, 0, WNOHANG);
  close(fd[0]);
  close(fd[1]);
}