我正在尝试在C for Unix中创build一个简单的shell。 我已经能够做所有的命令和执行的parsing,但我有一个pipe道问题。 我认为问题是,我没有挂在第二个命令的input正确的pipe道。
例如,如果我input“ls | wc”,它会在“wc”命令之后暂停,我想这是因为它等待input。 我认为问题是当我使用dup2(阅读[我],0),并没有挂在正确的pipe道。
我知道这是一个广泛的问题,但如果有任何我能得到的指针,我将不胜感激。 这是创build新进程并尝试pipe道的代码。
int fileds[2]; int reading[num_cmds]; int writing[num_cmds]; int p; for(p=0; p < num_cmds; p++) { reading[p] = -1; writing[p] = -1; } int j; for(j=0; j < num_cmds-1; j++) //Create pipes for commands { int fileds[2]; pipe(fileds); reading[j+1] = fileds[0]; writing[j] = fileds[1]; } int i = 0; for(i = 0; i < num_cmds;i++) { cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg); //Get command and args pid_t childpid; int status; childpid=fork(); if (childpid >= 0) { if (childpid == 0) { if(writing[i] != -1) { dup2(writing[i],1); close(writing[i]); } if(reading[i] != -1) { dup2(reading[i],0); close(reading[i]); } int h; for(h = 0; h < num_cmds; h++) { close(writing[h]); close(reading[h]); } if(execvp(cmd_args[0],cmd_args) == -1) { perror("Problem with command"); exit(0); } } else { wait(&status); int m; for(m = 0; m < num_cmds; m++) { if( writing[m] != -1) close(writing[m]); if( reading[m] != -1) close(reading[m]); } } } else { perror("fork"); continue; } input_file[0] = 0; output_file[0] = 0; run_bg = 0; } }
在c#中执行具有path依赖的batch file
在Windows中从C ++应用程序进行Thrift调用
宽到窄的字符
在webview(UWP)中启用触摸事件
PATHvariables的GetEnvironmentvariable()和SetEnvironmentvariable()
更新:多亏了理查德,我才弄明白了。 它是以错误的顺序closures文件描述符,而不是closures一些文件描述符的组合。 这是工作代码。
int fileds[2]; int reading[num_cmds]; int writing[num_cmds]; int p; for(p=0; p < num_cmds; p++) { reading[p] = -1; writing[p] = -1; } int j; for(j=0; j < num_cmds-1; j++) { int fileds[2]; pipe(fileds); reading[j+1] = fileds[0]; writing[j] = fileds[1]; } int i = 0; for(i = 0; i < num_cmds;i++) { cmd_args = parse_cmd(cmds[i],&run_bg); pid_t childpid; int status; childpid=fork(); if (childpid >= 0) { if (childpid == 0) { if(writing[i] != -1) { close(1); dup2(writing[i],1); } if(reading[i] != -1) { close(0); dup2(reading[i],0); } if(execvp(cmd_args[0],cmd_args) == -1) { perror("Problem with command"); exit(0); } } else { wait(&status); close(writing[i]); if(i > 0) { close(reading[i]); } } } else { perror("fork"); } input_file[0] = 0; output_file[0] = 0; run_bg = 0; }
types铸造int到双C ++
CreateProcess()似乎不受lpCurrentDirectory的影响
Windows Shell扩展:select多于16个文件时的上下文菜单
debugging日志搞砸了我的代码
设置tcp头中的最大段大小
我认为你的问题可能是你等待循环内的每个进程,然后关闭所有的文件描述符。 这使得下一次调用dup2()时文件描述符无效,导致下一个进程的stdin保持不变。
只是猜测,我没有运行的代码。
当我输入“ls | wc”wc时,按照预期输出并输出由ls命令输出的字数。 请记住,当你使用“|” 您不需要在应用程序中创建管道。 第一个命令需要输出到标准输出,第二个命令需要从标准输入读取输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。