关于select系统调用示例程序执行终端命令的疑问
问题原因
你当前提供的代码本身没有包含任何执行终端命令的逻辑,你找不到对应代码是正常的。
这段代码的完整功能只有以下几点:
- 初始化文件描述符集合,监听标准输入(对应文件描述符0)的可读事件
- 设置select的超时时间为5秒
- 调用select阻塞等待事件触发:
- 调用出错时打印错误信息
- 5秒内有输入到来时,仅打印
Data is available now.就直接退出 - 5秒无输入时,打印
No data within five seconds.直接退出
实现命令执行功能的修改方案
如果要实现你预期的「输入命令并执行」的效果,需要在retval > 0(有输入到来)的分支中补充两步逻辑:
- 从标准输入中读取用户输入的命令字符串,可使用
read()、fgets()等接口,注意处理输入末尾的换行符 - 调用系统命令执行接口运行读到的命令,简单场景可以直接用
system()函数,需要更精细的进程控制可以用fork()+exec系列函数实现。
以下是修改后的可实现对应功能的参考代码:
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <string.h> int main(void) { fd_set rfds; struct timeval tv; int retval; char cmd_buf[1024] = {0}; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 5; //in seconds tv.tv_usec = 0; //in microseconds retval = select(1, &rfds, NULL, NULL, &tv); /* Don't rely on the value of tv now! */ if (retval == -1) //select failed perror("select()"); else if (retval) { //user input printf("Data is available now.\n"); // 读取输入的命令 read(0, cmd_buf, sizeof(cmd_buf)-1); // 去掉末尾的换行符 cmd_buf[strcspn(cmd_buf, "\n")] = 0; // 执行命令 system(cmd_buf); } else printf("No data within five seconds.\n"); exit(EXIT_SUCCESS); }
内容的提问来源于stack exchange,提问作者Teja Puvvula
相关产品推荐
相关产品推荐

