标签:init for 竞争条件 存在 睡眠 pue 顺序 竞争 out
一、进程标识
二、函数fork
1.写时复制,copy-on-write
2.文件共享,父进程等待子进程完成,子进程结束后,它对任一共享描述符的读写操作的文件偏移量已做相应的更新,同时操作时,可以考虑使用文件锁
三、函数vfork
1.不完全复制父进程的地址空间
2.保证子进程先运行,直到其调用exec
四、函数exit(进程终止)
1.系统调用的_exit不冲洗标准I/O流,C库中的exit会;
2.父进程比子进程先终止,则子进程的父进程改为init进程,保证每个进程都有一个父进程
3.子进程终止,但父进程没对其进行资源释放,则变成僵尸进程,ps命令状态打印Z
五、函数wait和waitpid
1.当子进程正常或异常终止,内核会向父进程发送sigchld信号,因为这是异步事件;
2.wait使其调用者阻塞;如果不想阻塞,由不想子进程变成僵尸进程,可使用两个fork的方法:先fork一个子进程,然后再调用fork,第一个子进程exit,第二个子进程睡眠2s保证第一个子进程退出;
3.竞争条件
3.1等待父进程终止的方法:
while(getppid != 1){//轮询方式,比较浪费CPU时间,调用者每个1s被唤醒一次;
sleep(1);
}
3.2printf等标准输出依赖于内核使用两个进程运行的顺序及每个进程运行的时间长度,所以会存在竞争条件,setbuf(stdout,NULL)设置标准输出不带缓冲区
标签:init for 竞争条件 存在 睡眠 pue 顺序 竞争 out
原文地址:https://www.cnblogs.com/jly594761082/p/10291193.html