Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dup()正在创建文件,但未打印到其中 我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是-o,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()将输出重_C++ - Fatal编程技术网

dup()正在创建文件,但未打印到其中 我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是-o,那么我想将命令的输出重定向到一个文件。(output.txt)。我使用dup()将输出重

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

dup()正在创建文件,但未打印到其中 <>我试图在C++中创建一个shell。它创建了一个子进程,该子进程执行命令并将响应传回父进程。我想指定如果命令的第二个参数是
-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”之类的内容
as
char*
?它是
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”之类的内容
as
char*
?它是
const char*
,应该保持原样。更好的是,将
std::string
与一个简单的
=
进行比较。然后忽略所有这些函数的返回值。例如,您只是在编写
sizeof(foo)
bytes,即使您不知道以前的
read
foo
缓冲区中得到了那么多。从检查所有这些调用(read、write、open、dup、dup2等)的错误开始。