我试图执行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;命令并打印出最终输出,但终端不打印任何内容。有什么帮助吗?
答案 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]);
}