用父进程创建两个子进程

说白了,这俩代码改动是让逻辑更清晰,避免歧义,其实很简单。

展开讲,先说最重要的,赋值操作(=)的优先级低于比较操作(==),所以直接写 pid1 =fork()==-1 会先执行 fork(),然后结果再跟 -1 比较,最后再赋值给 pid1 ,这容易让人看懵。
改成 if((pid1 =fork())==-1 ) 把赋值括起来,确保先赋值再比较,逻辑就对了。
去年我们跑那个高并发项目,因为这细节踩坑过,直接导致半夜加班修bug。
另外一点,别忘了 if 后面那个分号,C语言里这可是硬伤,编译器会提示错误,但运行时可能乱出。
还有个细节挺关键的,比如 pid2 =fork()==-1 ,同样得改成 if((pid2 =fork())==-1 ),别偷懒。

我一开始也以为 fork() 的返回值就两种情况,后来发现 -1 还可能带点系统信息,比如 errno 设置了,所以严谨点还是用严格比较。

赶紧改了吧,说实话挺坑的。

一文了解Linux下2号进程的kthreadd

2 02 3 年,我那个朋友告诉我,Linux系统中有个idle进程,PID是0,这个进程很神奇,它负责加载系统和进程调度。
然后是init进程,PID是1 ,它加载init程序,是所有用户进程的祖进程。
还有个kthreadd进程,PID是2 ,它管理所有内核线程的调度。
这个进程创建的时候是在rest_init函数里,进程0创建了两个进程,其他内核线程的父进程都是2 内核线程大部分时间都是阻塞的,只有在有资源时才会运行。
kthreadd的核心是一个循环,检查列表,如果列表空,它就进入睡眠状态。
如果列表不空,它就遍历列表,创建新线程。
创建完线程后,kthreadd会继续检查列表。
我们通过kernel_create创建内核线程时,kthreadd会被唤醒,然后创建线程。
新线程创建后,需要使用wake_up_process唤醒它。
kthreadd真的很关键,是内核运行的关键组件。
通过了解它,我们更能理解Linux内核的进程管理。
对了,这个过程还挺复杂的。

Linux进程通信实验报告

实验结果:运行fork1 .c后,屏幕上可能只显示一次“a”,然后是“b”和“c”,或“b”和“c”同时出现,或顺序显示“b”和“c”后出现“a”。
原因:进程调度和输出缓冲区管理导致。
这就是坑,别信并发执行总是同步的。
别这么干,忽略系统调用细节。
实操提醒:仔细分析系统调用行为和进程调度策略。