我知道这个话题已经出现好几次了,但是我仍然停留在某一点。我需要编写一个模拟cmd1 | cmd2 | cmd3 ...
管道的程序。
我的代码在这里:http :
//ideone.com/fedrB8
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
void pipeline( char * ar[], int pos, int in_fd);
void error_exit(const char*);
static int child = 0; /* whether it is a child process relative to main() */
int main(int argc, char * argv[]) {
if(argc < 2){
printf("Usage: %s option (option) ...\n", argv[0]);
exit(1);
}
pipeline(argv, 1, STDIN_FILENO);
return 0;
}
void error_exit(const char *kom){
perror(kom);
(child ? _exit : exit)(EXIT_FAILURE);
}
void pipeline(char *ar[], int pos, int in_fd){
if(ar[pos+1] == NULL){ /*last command */
if(in_fd != STDIN_FILENO){
if(dup2(in_fd, STDIN_FILENO) != -1)
close(in_fd); /*successfully redirected*/
else error_exit("dup2");
}
execlp(ar[pos], ar[pos], NULL);
error_exit("execlp last");
}
else{
int fd[2];
pid_t childpid;
if ((pipe(fd) == -1) || ((childpid = fork()) == -1)) {
error_exit("Failed to setup pipeline");
}
if (childpid == 0){ /* child executes current command */
child = 1;
close(fd[0]);
if (dup2(in_fd, STDIN_FILENO) == -1) /*read from in_fd */
perror("Failed to redirect stdin");
if (dup2(fd[1], STDOUT_FILENO) == -1) /*write to fd[1]*/
perror("Failed to redirect stdout");
else if ((close(fd[1]) == -1) || (close(in_fd) == - 1))
perror("Failed to close extra pipe descriptors");
else {
execlp(ar[pos], ar[pos], NULL);
error_exit("Failed to execlp");
}
}
close(fd[1]); /* parent executes the rest of commands */
close(in_fd);
pipeline(ar, pos+1, fd[0]);
}
}
它对于多达3个命令完全可以正常工作,但是当涉及4个或更多命令时,它不再起作用,并且经过数小时的分析,我仍然无法弄清问题所在。
Example:
./prog ls uniq sort head
gives:
sort: stat failed: -: Bad file descriptor
不是专家,但似乎以下几行是问题所在:
((close(fd[1]) == -1) || (close(in_fd) == - 1))
尽量不要在in_fd
那里关闭。
我认为,父母正在尝试关闭与孩子同样的fd。
使用时,dup2()
您不需要关闭文件,因为dup2()
已经关闭了文件。
问题内容: 新手问题,但我有以下代码: 当用户输入“ y”时,我只需要简单地再次打印欢迎消息即可。但这不起作用。有任何想法吗? 问题答案: 在Java中,使用来比较原始类型(int,long,boolean等)的相等性,而使用方法来比较对象类型(String等)的相等性。如果使用比较两个Object类型,则要检查 身份 ,而不是相等性-也就是说,您要验证两个对象在内存中是否共享完全相同的引用(因此
问题内容: 我以为直到现在我都了解* nix管道…我有一个名为的可执行文件,它指向我的安装程序的符号链接,我以为我可以使用 但这是行不通的。它给我的效果等同于仅在当前目录中运行。 如果我跑步,我会得到。如果我运行,我得到的预期输出将显示符号链接位置。 那么,为什么管道版本不起作用?我还没为管道抱怨什么? 问题答案: 为此,您需要: 来自: xargs-从标准输入构建和执行命令行 要完全理解管道的工
问题内容: 我知道Go有一个包含搜索功能的程序包,但这是出于教育目的。我一直在尝试在Go中实现二进制搜索算法,但无法使其正常工作。 这是我的代码: 它总是打印。为什么? 问题答案: 二进制搜索的逻辑是合理的。唯一的问题是您忘记了将每个递归调用的结果分配给和。 当前,您有以下这些递归调用: 您只需要分配结果:
如何构建查询来实现这一点?
问题内容: 我需要从目录及其所有子目录复制所有文件。我如何在UNIX / Linux终端中做到这一点?命令不起作用。 问题答案: 对于本地文件复制以及计算机之间的复制很有用。这将做您想要的: 的完整目录结构。被复制到/ destination_dir,但是仅复制.jar文件。-a确保文件的所有权限和时间均不变。-m将省略空目录。-v用于详细输出。 对于空运行,请添加-n,它将告诉您它将执行的操作,
问题内容: 我对RxJava(和一般的Reactive范式)很陌生,所以请多多包涵。 假设我有这个和这个嵌套的数据结构: 并假设我有以下API端点: 现在,让我们假设: ** 现在,如果有的话,如何递归所有子项评论?即获得ID为[1,2,3,4,5,6]的评论? ** 我已经搜索并偶然发现了这个:https : //jkschneider.github.io/blog/2014/recursive