C 等待用户输入的进程实际会发生什么情况?
我想知道等待用户输入的进程的实际情况。比方说,在我的代码中,我调用scanf()从控制台读取用户输入。它将在内部调用read()系统调用。但在这种情况下,在用户提供任何输入之前,并没有数据可读取。那么,我们的进程到那时还在休眠吗?是的,它正在休眠(至少在OSX中是这样) 尝试编译并运行以下C程序:C 等待用户输入的进程实际会发生什么情况?,c,linux-kernel,C,Linux Kernel,我想知道等待用户输入的进程的实际情况。比方说,在我的代码中,我调用scanf()从控制台读取用户输入。它将在内部调用read()系统调用。但在这种情况下,在用户提供任何输入之前,并没有数据可读取。那么,我们的进程到那时还在休眠吗?是的,它正在休眠(至少在OSX中是这样) 尝试编译并运行以下C程序: #包括 int main(){ int x; 放入(“输入一个数字:”); 如果(扫描频率(“%d”、&x)){ printf(“您输入了%d\n”,x); } 否则{ 看跌期权(“那不是一个数字”)
#包括
int main(){
int x;
放入(“输入一个数字:”);
如果(扫描频率(“%d”、&x)){
printf(“您输入了%d\n”,x);
}
否则{
看跌期权(“那不是一个数字”);
}
返回0;
}
启动在控制台中运行的程序,然后打开另一个控制台并在命令行中输入ps-v
。您应该看到如下内容:
PID STAT TIME SL RE PAGEIN VSZ RSS LIM TSIZ %CPU %MEM COMMAND
19544 S 0:00.01 0 0 0 2463084 1596 - 0 0.0 0.0 -bash
19574 S 0:00.01 0 0 0 2454892 1568 - 0 0.0 0.0 -bash
19582 S+ 0:00.00 0 0 0 2434816 676 - 0 0.0 0.0 ./a
这里,
/a
是程序的名称。STAT
列中该进程的条目是S+
,这意味着该进程正在休眠(S
),并且处于前台(++
) 您的进程将被阻止,这意味着:等待I/O。内核会记住进程的状态(在read()系统调用中),并允许它在I/O可用时运行。这是否意味着TTY驱动程序会以某种方式通知调度程序数据可用,调度程序会将进程移动到就绪队列?TTY驱动程序与此无关。程序可以从管道或套接字或filedescriptor所指的任何地方获取输入。IIRC linux对可运行进程和等待进程使用单独的列表(队列)。一旦数据可用/不可用,进程的记录将在这些队列之间移动。调度程序只关心可运行队列。@techiek7。如果您知道条件变量是什么,那么内核在内部使用它来通知任何感兴趣的人tty(或您正在读取的任何其他文件描述符)上发生了有趣的事情。