Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 等待用户输入的进程实际会发生什么情况?_C_Linux Kernel - Fatal编程技术网

C 等待用户输入的进程实际会发生什么情况?

C 等待用户输入的进程实际会发生什么情况?,c,linux-kernel,C,Linux Kernel,我想知道等待用户输入的进程的实际情况。比方说,在我的代码中,我调用scanf()从控制台读取用户输入。它将在内部调用read()系统调用。但在这种情况下,在用户提供任何输入之前,并没有数据可读取。那么,我们的进程到那时还在休眠吗?是的,它正在休眠(至少在OSX中是这样) 尝试编译并运行以下C程序: #包括 int main(){ int x; 放入(“输入一个数字:”); 如果(扫描频率(“%d”、&x)){ printf(“您输入了%d\n”,x); } 否则{ 看跌期权(“那不是一个数字”)

我想知道等待用户输入的进程的实际情况。比方说,在我的代码中,我调用scanf()从控制台读取用户输入。它将在内部调用read()系统调用。但在这种情况下,在用户提供任何输入之前,并没有数据可读取。那么,我们的进程到那时还在休眠吗?

是的,它正在休眠(至少在OSX中是这样)

尝试编译并运行以下C程序:

#包括
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(或您正在读取的任何其他文件描述符)上发生了有趣的事情。