process.start("cmd.exe",args); process.waitForStarted(); process.write("echo 98 > /sys/class/gpio/export;echo high > /sys/class/gpio/gpio98/direction;echo 99 > /sys/class/gpio/export;cat /sys/class/gpio/gpio99/value\n");代码中没有多次调用 process.write 方法的情况下process.write为什么会执行两遍,如何制止
时间: 2023-08-02 19:11:41 浏览: 54
根据你提供的代码,我猜测可能出现了缓冲区的问题。当调用 `process.write()` 方法时,写入的数据并不会立即发送到子进程,而是先暂存在缓冲区中,直到缓冲区满或者手动调用 `process.flush()` 方法才会将数据发送到子进程中。因此,在你的代码中,由于缓冲区满或者其他原因,第一个 `process.write()` 写入的数据没有被发送到子进程中,当程序执行到第二个 `process.write()` 时,之前的数据也被一起发送了,导致实际执行的命令是两个 `process.write()` 写入的命令的组合。
要解决这个问题,可以在每次调用 `process.write()` 方法后手动调用 `process.flush()` 方法将数据立即发送到子进程中,如下所示:
```
process.start("cmd.exe",args);
process.waitForStarted();
process.write("echo 98 > /sys/class/gpio/export;echo high > /sys/class/gpio/gpio98/direction;echo 99 > /sys/class/gpio/export;cat /sys/class/gpio/gpio99/value\n");
process.flush(); // 手动将数据发送到子进程中
```
这样就可以确保每次写入的数据都会立即发送到子进程中,避免多次命令的组合。
相关问题
args << "/c" << command; process.start("cmd.exe",args);啥意思
这段代码的作用是启动一个名为cmd.exe的进程,并执行一个命令。具体来说,args是一个QStringList类型的变量,它用来存放传递给cmd.exe的参数。在这段代码中,我们往args中添加了两个参数: "/c"和command。其中,"/c"的作用是告诉cmd.exe要执行一个命令,并在执行完后自动关闭cmd.exe窗口;而command则是要执行的实际命令。最后,通过调用process.start("cmd.exe",args)来启动cmd.exe进程,并将args作为参数传递给它。这样,cmd.exe就会执行我们传递的命令了。
没有 process.pid(); // get the pid
非常抱歉,我犯了一个错误。在 Java 中,获取进程 ID 的正确方法是使用 `ProcessHandle` 类。以下是一个使用 `ProcessHandle` 获取进程 ID 的示例:
```java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class LinuxCommandExecutor {
public static void main(String[] args) {
String command = "your linux command here";
try {
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
reader.lines().forEach(line -> {
// do something with the output
});
long pid = process.toHandle().pid(); // get the pid
process.waitFor();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
请注意,`Process` 类现在提供了一个名为 `toHandle()` 的方法,该方法返回一个 `ProcessHandle` 对象,可以用来获取进程 ID。