我正在运行int fork_process(Command_Group* cmd_group, int cmd_idx, int fd[2], int second_fd[2], char* position) {
if (cmd_group == NULL) {
perror("invalid null command passed to fork_process");
return -1;
}
Command* cmd = cmd_group->cmd_list[cmd_idx];
pid_t pid;
if (strcmp(position, FIRST) == 0) {
pipe(fd);
} else if (strcmp(position, MIDDLE) == 0) {
pipe(second_fd);
}
if ((pid = fork()) < 0) {
perror("invalid fork command\n");
exit(EXIT_FAILURE);
} else if (pid == 0) { // Child
if (strcmp(position, FIRST) == 0) {
if (dup2(fd[OUT], STDOUT_FILENO) < 0) {
perror("invalid piping: dup2 failure");
return -1;
}
if (setpgid(pid, pid) < 0) {
perror("invalid setpgid failure");
}
}
else if (strcmp(position, MIDDLE) == 0) {
if (dup2(fd[IN], STDIN_FILENO) < 0 || dup2(second_fd[OUT], STDOUT_FILENO) < 0) {
perror("invalid piping: dup2 failure");
return -1;
}
if (setpgid(pid, cmd_group->pgid) < 0) {
perror("invalid setpgid failure");
}
}
else if (strcmp(position, FINAL) == 0) {
if (dup2(fd[IN], STDIN_FILENO) < 0) {
perror("invalid piping: dup2 failure");
return -1;
}
if (setpgid(pid, cmd_group->pgid) < 0) {
perror("invalid setpgid failure");
}
}
close_pipes(cmd_group->pipe_fds, cmd_group->pipe_count);
if (create_redirects(cmd) < 0) {
perror("invalid redirection error");
return -1;
}
if (execvp(cmd->cmd, cmd->args) < 0) {
perror("invalid: execvp failure");
return -1;
}
}
// Parent
if (strcmp(position, FIRST) == 0 || strcmp(position, ONLY) == 0) {
setpgid(pid, pid);
cmd_group->pgid = pid;
} else {
setpgid(pid, cmd_group->pgid);
}
cmd->pid = pid;
return 0;
}
(用于FRC的gradew部署),并且将其输出定向到Process
和BufferedReader
(在下面的块中JFrame
)用于包含parent
(JPanel
)的JTextArea
的新窗口。最初,我有这种方法来更新文本区域,同时读取outputArea
的输出:
Process
此实现在public void show(BufferedReader in){
outputArea.setText("");
while(true){
String line = in.readLine();
if(line == null){
break;
}
outputArea.append(line + "\n");
}
parent.setTitle("Deploy Output");
}
运行时显示空白窗口,并且仅在完成后才更新为输出。
当前,要尝试对其进行更新,我在以下位置创建了Process
和窗口,并创建了以下循环和后续方法:
Process
while(!outputWindow.getDone()){ //getDone returns done as set in the subsequent method
outputWindow.show(br); //br = the BufferedReader
outputWindow.repaint();
}
我尝试过的其他方法包括将public void show(BufferedReader in){
String line = in.readLine();
if(line == null){
parent.setTitle("Deploy Output");
done = true;
return;
}
outputArea.append(line + "\n");
}
与SwingUtilities.invokeLater()
一起使用,与repaint
创建一个新线程,以及将repaint
与revalidate
一起使用。根据此版本的while循环的每次迭代期间进行的打印调试,表明它在更新之前就已获得输出,但是在repaint
完成之后,它仅显示文本和框架的其他组成部分。
任何援助将不胜感激。
编辑(几乎忘了)-整个项目的Github存储库在这里,它具有方法的第一个版本:Github