linux进程等待I / O,其状态是S +不是D?

时间:2017-03-10 11:20:01

标签: c++ linux process io wait

我预计等待I / O资源的linux进程应该处于“D”状态,所以我测试了:

$cat testD.cpp
#include<assert.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
char hello[]="hello";
int main(){
    int fd[2];
    assert(pipe(fd)==0);
    pid_t pid=fork();
    if(pid==0){//child
        sleep(10);
        getchar();
    }else{//father
        char buf[1024];
        read(fd[0],buf,sizeof(buf));
        printf("read%s\n",buf);
        int status;
        waitpid(pid,&status,0);
    }
    return 0;
}

编译并运行它:

$g++ testD.cpp && ./a.out

我发现它的状态是S +,但不是我预期的D.

$ps -a -umyself -o pid,ppid,stat,command|grep a.out
 29798  47236 S+   ./a.out
 29799  29798 S+   ./a.out
 29953  59678 S+   grep --color a.out

我的问题是如何在D状态下创建自己的进程?只是希望模拟这种情况

1 个答案:

答案 0 :(得分:1)

至少,正常的read()系统调用是可中断的,解释了为什么你的进程处于可中断的睡眠S +中,而不是在不间断的睡眠中。这是一个链接: What is an uninterruptable process?