C 子进程在父进程之后启动
我有一个简单的代码来测试C 子进程在父进程之后启动,c,linux,fork,C,Linux,Fork,我有一个简单的代码来测试fork()函数 #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++)
fork()
函数
#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 = %d\n", pid, i);
}
}
解释很简单。
进程的调度取决于内核。如果这是一个单核处理器,那么在这次运行中,它决定暂停子进程的执行,并允许父进程首先运行。父对象在挂起以利于子对象之前运行了几个循环,以此类推。在多处理器系统中,两个进程可以串联运行,但控制台设备将根据中断的时间交替输出 无法保证不同的运行将产生相同的输出。也不能保证不同的内核版本不会做其他事情
如果您想让进程在循环之间交替,现在是学习的时候。主进程不会立即放弃控制,for循环执行得如此之快,以至于在第二个进程被调度之前就完成了。当我执行你的代码时,我会得到非连续的打印,但是行为是依赖于系统的 当你玩
fork()
时,有时抛出sleep()
命令会有所帮助。请尝试此代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX_COUNT 10
int main(void)
{
pid_t pid;
int i;
fork();
pid = getpid();
srand(pid); // Make sure each process has a different seed
for(i = 1; i <= MAX_COUNT; i++)
{
printf("PID = %d, i = %d\n", pid, i);
// Sleep 1-3 seconds.
unsigned int sleep_seconds = rand() % 3 + 1;
sleep(sleep_seconds);
}
}
#包括
#包括
#包括
#定义最大计数10
内部主(空)
{
pid_t pid;
int i;
fork();
pid=getpid();
srand(pid);//确保每个进程都有不同的种子
对于(i=1;i),这两个进程独立运行,因此一旦发生分叉,就不能期望有任何特定的顺序(这取决于操作系统调度)。如果您想要一个特定的排序,您必须使用同步机制明确地自己执行。例如,等待、信号量、互斥、管道等。我的意思当然是在进程之间排序。进程内的排序是自然定义的。请尝试添加sleep(1);
到for循环。@问题C这不是一个好主意。它会将进程返回给调度程序,但无法保证调度程序会在进程之间交替。如果您的目标只是测试fork()
闲聊一下,到处乱扔睡眠是很正常的做法。我相信在这种情况下,交替真的意味着非顺序。一般来说,在调度进程时,您可以期望内核是“公平的”。这意味着,如果父级和子级长时间运行,它们将获得大致相同的处理量当然,这里考虑的时间尺度远远大于两次循环迭代。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX_COUNT 10
int main(void)
{
pid_t pid;
int i;
fork();
pid = getpid();
srand(pid); // Make sure each process has a different seed
for(i = 1; i <= MAX_COUNT; i++)
{
printf("PID = %d, i = %d\n", pid, i);
// Sleep 1-3 seconds.
unsigned int sleep_seconds = rand() % 3 + 1;
sleep(sleep_seconds);
}
}