Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 子进程在父进程之后启动_C_Linux_Fork - Fatal编程技术网

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);
  }
}