繁体   English   中英

如何将hping3的输出从子级传递到父级?

[英]How to pipe through the output of hping3 from child to parent?

我最近问了一个有关如何在ac程序中调用hping3的问题。 提供的解决方案有效,但是我现在有另一个问题。 hping3的输出必须传递给父进程,所以我做了以下工作。 请注意,这只是codenippet,我认为错误在其中。 以下代码段在循环内运行,在其中循环访问一系列ip地址,这对于在我的mpi程序中提供两种不同的分发策略很有必要。

//Stick together the params
sprintf(params, "--scan %u %u.%u.%u.%u -V", *(portarray + i), (iterator & 0xFF000000)>>24, (iterator & 0x00FF0000)>>16, (iterator & 0x0000FF00)>>8, (iterator & 0x000000FF));
            //Pipe and check status
            if(pipe(pipes)==-1){
               perror("Error piping");
            }
            //Fork and check status
            pid=fork();
            if(pid == -1){
               perror("Error forking");
            } else if(pid > 0){
               //Parent does not write
               close(pipes[1]);
               //Save stdout from pipe
               nbytes = read(pipes[0], buffer, sizeof(buffer));
               //Parent, wait for child
               waitpid(pid, &status, 0);
               //Print out pipe
               printf("hping3: (%.*s)\n", nbytes, buffer);
               wait(NULL);
               close(pipes[0]);
            } else {
               //Child does not read
               close(pipes[0]);
               //Map stdout and stderr to write pipe-end
               dup2(pipes[1], 1);
               dup2(pipes[1], 2);
               //Child, exec hping with params
               execl("sudo /usr/sbin/hping3","sudo /usr/sbin/hping3",params,NULL);
               close(pipes[1]);
               //Exit child to prevent fork-bomb
               return 0;
            }
            //Sleep for specified delaytime
            sleep((unsigned int)delay);

我不知道问题出在哪里。 输出如下(当然是循环的):

hping3()

hping3程序将输出到stdout和stderr,我通过输出重定向到文件在外壳上对其进行了测试。

如何定义缓冲区? 您是否检查过nbytes的值? 您确定正在执行hping吗? 我会尝试以下方法:

int buffsize  = 100;
char * buffer = malloc(buffsize);

if (pid == -1) {
   perror("Error forking");
} else if (pid > 0) {
   //Parent does not write
   close(pipes[1]);
   // I'd first wait for the child to finish.
   waitpid(pid, &status, 0);
   // Save stdout from pipe 
   // recall that sizeof(buffer) != buffsize when malloc'ed.
   int count = 0;
   while((nbytes = read(pipes[0], buffer+count, buffsize-count) != -1) count += nbytes;
   //Print out pipe
   printf("hping3: (%.*s)\n", nbytes, buffer);
   wait(NULL);
   close(pipes[0]);
} else {
   //Child does not read
   close(pipes[0]);
   //Map stdout and stderr to write pipe-end
   dup2(pipes[1],1);
   dup2(pipes[1],2);
   // Close pipes[1]
   close(pipes[1]);
   //Child, exec hping with params
   if (execl("sudo /usr/sbin/hping3","sudo /usr/sbin/hping3",params,NULL) == -1)
      perror("execl error");
   //Exit child to prevent fork-bomb
   return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM