Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475754
  • 博文数量: 111
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 939
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 11:23
个人简介

Nathing

文章分类

全部博文(111)

文章存档

2016年(2)

2015年(1)

2014年(31)

2012年(2)

2011年(9)

2010年(36)

2009年(30)

我的朋友

分类: LINUX

2009-07-20 10:23:22

当一个进程调用了fork 以后,系统会创建一个子进程.
fork 返回-1 :fork调用失败
fork 返回0  :fork创建为子进程
else       : fork为父进程,fork返回为子进程的id。

阻塞(Block):当进程调用一个阻塞的系统函数时,该进程被置于睡眠(sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行.
运行(Running):分两种情况:1,正在被执行。2,就绪状态:该进程不需要等待什么事件发生,随时都可以执行,但cpu暂时还在执行另一个进程,所以该进程在一个就绪 队列中等待被内核调度。

一个非阻塞例子:
#include
#include
#include
#include
#include

#define MSG_TRY "try again\n"

int main(void)
{
        char buf[10];
        int fd, n;
        fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
        if(fd<0)
        {
                perror("open /dev/tty");
                exit(1);
        }
        tryagain:
        n = read(fd, buf, 10);
        if (n < 0)
        {
                if (errno == EAGAIN) //非阻塞模式下调用了阻塞操作,在该操作没有完成就返回EAGAIN
                {
                        sleep(5);
                        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
        goto tryagain;
                }
                perror("read /dev/tty");
                exit(1);
        }
        write(STDOUT_FILENO, buf, n);
        close(fd);
        return 0;
}


阅读(1149) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~