You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于select系统调用示例程序执行终端命令的疑问

问题原因

你当前提供的代码本身没有包含任何执行终端命令的逻辑,你找不到对应代码是正常的。

这段代码的完整功能只有以下几点:

  • 初始化文件描述符集合,监听标准输入(对应文件描述符0)的可读事件
  • 设置select的超时时间为5秒
  • 调用select阻塞等待事件触发:
    • 调用出错时打印错误信息
    • 5秒内有输入到来时,仅打印Data is available now.就直接退出
    • 5秒无输入时,打印No data within five seconds.直接退出

实现命令执行功能的修改方案

如果要实现你预期的「输入命令并执行」的效果,需要在retval > 0(有输入到来)的分支中补充两步逻辑:

  1. 从标准输入中读取用户输入的命令字符串,可使用read()、fgets()等接口,注意处理输入末尾的换行符
  2. 调用系统命令执行接口运行读到的命令,简单场景可以直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:15:03