I have a simple code to test the fork()
function.
#include<stdio.h> #include<unistd.h> #define MAX_COUNT 10 void main(void) { pid_t pid; int i; fork(); pid = getpid(); for(i = 1; i <= MAX_COUNT; i++) { printf("PID = %d, i = %dn", pid, i); } }
It didn’t work as I expected.
My expectation is: parent’s result and child’s result appear alternately. Can someone explain this and teach me how to fix it? Thanks!
PID = 3663, i = 1 PID = 3663, i = 2 PID = 3663, i = 3 PID = 3663, i = 4 PID = 3663, i = 5 PID = 3663, i = 6 PID = 3663, i = 7 PID = 3663, i = 8 PID = 3663, i = 9 PID = 3663, i = 10 PID = 3664, i = 1 PID = 3664, i = 2 PID = 3664, i = 3 PID = 3664, i = 4 PID = 3664, i = 5 PID = 3664, i = 6 PID = 3664, i = 7 PID = 3664, i = 8 PID = 3664, i = 9 PID = 3664, i = 10
Advertisement
Answer
The explanation is simple.
Scheduling of processes is up to the kernel. If this is a single core processor then in this run it decided to suspend the child execution and allow the parent process to run first. The parent ran for a few loops before being suspended in favor of the child, and so forth.
In a multiprocessor system both process can run in tandem but the console device will alternate the output depending on timing of interrupts.
There is no assurance a different run will result in the same output. There is also no assurance that different kernel version won’t do something else.
If you want the processes to alternate between loops now is the time to learn interprocess communication.