ret = poll(pollfds, 1, timeout *1000);
时间: 2024-06-04 07:07:07 浏览: 10
这段代码使用了 Linux 系统中的 poll 函数,用于等待文件描述符上的事件。其中,pollfds 是一个指向 struct pollfd 结构体数组的指针,数组中每个元素描述了一个要监视的文件描述符及其关注的事件,1 表示监视的文件描述符数量为 1,timeout 表示等待事件的超时时间,单位为秒。
poll 函数会阻塞等待文件描述符上的事件,直到有事件发生或者超时时间到达。当有事件发生时,poll 函数会返回一个大于 0 的整数,表示有多少个文件描述符上有事件发生了;当超时时间到达时,poll 函数会返回 0;当发生错误时,poll 函数会返回 -1。返回值保存在 ret 变量中。
相关问题
def exec_shell(name ,cmd_str ,timeout=5 * 60): ret_values = [128] start_time = time.time() result = subprocess.Popen(cmd_str, shell=True) isrun = True while result.poll() is None and isrun: now = time.time() if now - start_time >= timeout and result.poll() is None: break time.sleep(1) ret = os.system('ssh -o ConnectTimeout=3 '+ name +' \"cd\"') if ret != 0: logging.info('%s Connect Timeout, ERROR: %d' % (name,ret)) isrun = False if result.poll() is None: result.terminate() # os.killpg(os.getpgid(result.pid), signal.SIGTERM) # os.kill(result.pid, signal.SIGKILL) kill_process(result.pid) ret_values[0] = 65535 else: ret_values[0] = result.returncode return ret_values[0]代码问题
这段代码看起来是用于执行 shell 命令的函数,但是其中有一些问题:
1. 在函数内部执行了一个无限循环,如果命令执行时间超过了指定的 timeout 时间,就会退出循环。但是这个循环会一直占用 CPU 资源,不太合理。可以使用 Python 的 `subprocess.call()` 函数来执行命令,并且可以通过 `timeout` 参数设置超时时间。
2. 在循环内部还执行了一个 `os.system()` 命令,这个命令会新开一个进程去执行 `ssh` 命令,这样会增加系统负担。可以使用 `paramiko` 库来实现 SSH 连接。
3. 函数最后返回的 `ret_values[0]` 只有一个元素,而且这个元素在函数内部已经被修改了,使用一个变量就可以了。
下面是修改后的代码:
```python
import subprocess
import time
import paramiko
def exec_shell(name, cmd_str, timeout=5*60):
start_time = time.time()
try:
result = subprocess.run(cmd_str, shell=True, check=True, timeout=timeout)
ret = result.returncode
except subprocess.TimeoutExpired:
ret = 65535
except subprocess.CalledProcessError as e:
ret = e.returncode
except Exception as e:
ret = 128
# 这里可以根据返回值做相应的处理,比如记录日志等
return ret
def ssh_connect(name):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(name, timeout=3)
return True
except:
return False
def exec_ssh_cmd(name, cmd_str, timeout=5*60):
start_time = time.time()
while True:
if ssh_connect(name):
break
now = time.time()
if now - start_time >= timeout:
logging.info('%s Connect Timeout' % name)
return 65535
time.sleep(1)
stdin, stdout, stderr = ssh.exec_command(cmd_str, timeout=timeout)
ret = stdout.channel.recv_exit_status()
# 这里可以根据返回值做相应的处理,比如记录日志等
return ret
```
其中 `exec_shell()` 函数使用了 Python 内置的 `subprocess.run()` 函数来执行 shell 命令,可以设置超时时间和检查命令是否执行成功的选项,这样就不需要使用循环了。
另外,我还添加了一个 `ssh_connect()` 函数来判断是否能够连接到远程服务器,以及一个 `exec_ssh_cmd()` 函数来执行 SSH 命令。这两个函数使用了 `paramiko` 库来实现 SSH 连接和命令执行,比较方便和安全。
linux内核的regmap_read_poll_timeout函数怎么使用
regmap_read_poll_timeout函数是用于轮询寄存器的值是否满足指定条件的函数,其使用方法如下:
```c
int regmap_read_poll_timeout(struct regmap *map, unsigned int reg,
unsigned int val, unsigned int mask,
unsigned int timeout)
```
其中,map是一个regmap对象,reg是要轮询的寄存器地址,val是期望的寄存器值,mask是掩码,timeout是轮询的超时时间(单位是ms)。
调用该函数后,函数会不断读取寄存器的值,直到读取到的值与期望的值按位与后等于期望的值,或者超时时间到达。如果在超时时间到达之前读取到了期望的值,则函数返回0;否则函数返回-EAGAIN表示轮询超时。
例如,以下代码使用regmap_read_poll_timeout函数轮询某个寄存器的值是否为0,最长轮询时间为1000ms:
```c
#define REG_ADDR 0x1234
int ret = regmap_read_poll_timeout(map, REG_ADDR, 0x0, 0xffffffff, 1000);
if (ret == 0) {
printk(KERN_INFO "Regmap read poll succeeded\n");
} else {
printk(KERN_INFO "Regmap read poll timed out\n");
}
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)