Sleep sort
顾名思义,睡眠排序通过为待排序的元素启动独立的任务,每个任务按照待排元素的key执行相对应的睡眠时间,然后及时的将序列中的元素收集到一起,达到排序的目的。
C++实现wiki
下面是采用C语言实现的sleep sort的简单示例代码:
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int c, char **v)
{
while (--c > 1 && !fork());
sleep(c = atoi(v[c]));
printf("%d\n", c);
wait(0);
return 0;
}
上面代码中使用了fork()
函数,下面将会给出该函数的一个简单使用说明。
fork用法
-
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
- 1)在父进程中,fork返回新创建子进程的进程ID;
- 2)在子进程中,fork返回0;
- 3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,因为子进程没有子进程,所以其fpid为0.
-
fork出错可能有两种原因:
- 1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
- 2)系统内存不足,这时errno的值被设置为ENOMEM。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
fork执行完毕出现两个进程,如下图所示: