dup()正在创建文件,但未打印到其中 我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是-o,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()将输出重
dup()正在创建文件,但未打印到其中 <>我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是dup()正在创建文件,但未打印到其中 我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是-o,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()将输出重,c++,C++,dup()正在创建文件,但未打印到其中 我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是-o,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()将输出重定向到我的文件。但是,当我运行程序并输入例如wc-o fileName时,程序会创建文件output.txt,但在我指定打印子进程的结果时不会写入该文件 #include <iostream> #include <unistd
-o
,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()
将输出重定向到我的文件。但是,当我运行程序并输入例如wc-o fileName
时,程序会创建文件output.txt,但在我指定打印子进程的结果时不会写入该文件
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <cstring>
#include <fcntl.h>
#include <vector>
#include <sys/wait.h>
int main(){
// array of file descriptors for parent and child
int filedes[2];
char foo[4096];
char** argv;
std::cout << "$$-> ";
char command[128];
std::cin.getline(command, 128);
if(strlen(command) != 0) {
std::vector<char *> args;
char *prog = strtok(command, " ");
char *tmp = prog;
while(tmp != NULL) {
args.push_back(tmp);
tmp = strtok(NULL, " ");
}
argv = new char *[args.size() + 1];
for (int k = 0; k < args.size(); k++) {
argv[k] = args[k];
}
argv[args.size()] = NULL;
}
char* newargc = argv[0];
char *newargv[] = {newargc,argv[2],NULL};
if(pipe(filedes) < 0){
std::cout << "There was an error creating the pipe";
}
int pid = fork();
if(pid == 0){
// writing to the pipe
// close read end of pipe
close(filedes[0]);
close(STDOUT_FILENO);
dup(filedes[1]);
if(strcmp(argv[1],(char*)"-o") == 0 ||strcmp(argv[1], (char*) "-b") == 0){
execvp(newargv[0], newargv);
}
else{
execvp(argv[0],argv);
}
}
else if (pid > 0) {
std::cout << "This is the parent process\n";
while(wait(NULL) > 0);
close(filedes[1]);
int output_fd = open("output.txt", O_CREAT, O_TRUNC, O_RDWR);
read(filedes[0], foo, sizeof(foo));
if(strcmp(argv[1],(char*)"-o") == 0){
close(STDOUT_FILENO);
dup(output_fd);
write(output_fd, foo, sizeof(foo));
}
else if(strcmp(argv[1], (char*) "-b") == 0){
int stdoutHolder = dup(STDOUT_FILENO);
close(STDOUT_FILENO);
dup(output_fd);
std::cout<< foo;
dup2(stdoutHolder, 1);
}
std::cout << foo;
}
//pid is less than 0 if error
else{
std::cout << "There is an error.";
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
//父级和子级的文件描述符数组
int filedes[2];
查富[4096];
字符**argv;
STD::CUT不把C++问题标记为C。因为你使用C++,只要可能,就使用<代码> STD::String 。这个代码充满了C缓冲区溢出错误。你还应该转向 STD::向量< /代码>,而不是<代码> NeX[]/Calp>。
。您应该在第二个参数中将O
标志与
组合在一起,而不是将它们作为第二、第三和第四个参数传递。如果您使用的是O\u create
,那么第三个参数应该是新打开的文件的模式。为什么要强制转换“-O”之类的内容aschar*
?它是const char*
,应该保持原样。更好的是,将std::string
与一个简单的=
进行比较。然后忽略所有这些函数的返回值。例如,您只是在编写sizeof(foo)
bytes,即使您不知道以前的read
在foo
缓冲区中得到了那么多。从检查所有这些调用的错误开始(读、写、打开、dup、dup2等)不要把C++问题标记为C。因为你使用C++,只要可能,就使用<代码> STD::String 。这个代码中有C缓冲区溢出错误。你还应该转向 STD::vector < /C> >而不是<代码> NeX[]/Calp>。
。您应该在第二个参数中将O
标志与
组合在一起,而不是将它们作为第二、第三和第四个参数传递。如果您使用的是O\u create
,那么第三个参数应该是新打开的文件的模式。为什么要强制转换“-O”之类的内容aschar*
?它是const char*
,应该保持原样。更好的是,将std::string
与一个简单的=
进行比较。然后忽略所有这些函数的返回值。例如,您只是在编写sizeof(foo)
bytes,即使您不知道以前的read
在foo
缓冲区中得到了那么多。从检查所有这些调用(read、write、open、dup、dup2等)的错误开始。