当一个进程调用了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;
}
阅读(1177) | 评论(0) | 转发(0) |