在 C++ 中 std::cin 里面发生了什么?
What happens inside std::cin in C++?
我正在阅读有关 std::cin
的文章,我看到我的程序停在它所在的一行,有点“等待”我输入并按 Enter 键。幕后发生了什么? std:cin
如何暂停整个程序?
粗略地说,从 std::cin 读取的调用将导致从 'Standard Input' 读取的系统调用。在 Linux,这是文件描述符 0。当您的进程进行系统调用时,您处于内核中,这会使您的进程暂停,直到它有一些数据要交给您(它写入您的缓冲区并恢复您的执行)。
注意:完全过于简单和抽象来回答问题的精神。
针对注释的详细说明:
所以,这里是 CPU,慢慢执行可执行文件的指令(在您的进程的上下文中)。您进行系统调用。 CPU 停止执行程序指令,将程序状态保存在内核数据结构中,然后开始执行内核。您的进程现在正在休眠。它一直处于睡眠状态,直到吻了一个王子内核决定唤醒它,此时内核安排CPU恢复它的状态并继续。
任何时候您通过系统调用进入内核,内核都可以选择让您休眠一段时间。 (它还可以根据需要根据 I/O 中断或计时器让您进入睡眠状态,以便与其他进程共享 CPU。)
我正在阅读有关 std::cin
的文章,我看到我的程序停在它所在的一行,有点“等待”我输入并按 Enter 键。幕后发生了什么? std:cin
如何暂停整个程序?
粗略地说,从 std::cin 读取的调用将导致从 'Standard Input' 读取的系统调用。在 Linux,这是文件描述符 0。当您的进程进行系统调用时,您处于内核中,这会使您的进程暂停,直到它有一些数据要交给您(它写入您的缓冲区并恢复您的执行)。
注意:完全过于简单和抽象来回答问题的精神。
针对注释的详细说明:
所以,这里是 CPU,慢慢执行可执行文件的指令(在您的进程的上下文中)。您进行系统调用。 CPU 停止执行程序指令,将程序状态保存在内核数据结构中,然后开始执行内核。您的进程现在正在休眠。它一直处于睡眠状态,直到吻了一个王子内核决定唤醒它,此时内核安排CPU恢复它的状态并继续。
任何时候您通过系统调用进入内核,内核都可以选择让您休眠一段时间。 (它还可以根据需要根据 I/O 中断或计时器让您进入睡眠状态,以便与其他进程共享 CPU。)