gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:50 25 4
gpt4 key购买 nike

我最近问了一个关于如何在 c 程序中调用 hping3 的问题。提供的解决方案有效,但我现在有另一个问题。 hping3 的输出必须传递给父进程,所以我做了以下操作。请注意,这只是代码片段,我认为错误就在其中。以下代码片段在一个循环内运行,我在其中循环访问一系列 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,我通过输出重定向到文件在 shell 上测试了它。

最佳答案

缓冲区是如何定义的?你有没有检查过 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;
}

关于c - 如何将 hping3 的输出从子级传递到父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com