fork()函数之后父子进程执行顺序问题

102101502-龙安媛 2023-11-16 13:46:31

#include<stdio.h>
#include<unistd.h>
void main (void){
int x=5;
int t = fork();
sleep(1); // 添加sleep函数,父子进程将会乱序输出
if(t){
x += 30;
printf ("%d\n",x);
}
else
printf("%d\n",x);
printf("%d\n",x);
}
为啥调用了sleep()还是父进程先执行

...全文
384 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
清贫码农 2023-11-24
  • 打赏
  • 举报
回复

调用了sleep()函数后,父进程和子进程的执行顺序仍然是不确定的。这是因为fork()函数创建了一个子进程,而子进程会继承父进程的所有资源,包括内存、文件描述符等。在fork()之后,父进程和子进程分别执行不同的代码块。

在这个例子中,父进程先执行if(t)语句块中的代码,然后执行else语句块中的代码。而子进程则直接跳过if(t)语句块,直接执行else语句块中的代码。因此,即使调用了sleep()函数,父进程和子进程的执行顺序仍然是不确定的。

噼里啪啦啦 2023-11-18
  • 打赏
  • 举报
回复

在你提供的C语言代码里,fork() 函数用来创建一个新的子进程,这是Unix和类Unix系统(比如Linux)中的一个常用函数。fork() 会返回两次,一次是在父进程里,返回子进程的PID(进程标识符),另一次是在子进程里,返回0。

你加了 sleep(1);,理论上是让执行到这里的进程暂停1秒。但这个 sleep 并不能保证父进程会在子进程之后运行。实际上,父子进程谁先运行是由操作系统的调度策略决定的,这个策略会尝试公平地分配CPU时间给所有进程,但具体顺序是不确定的。

如果你想要父进程等子进程先跑完,你应该在父进程里用 wait() 函数,这样父进程会等待子进程结束后才继续执行。如果你不这么做,父子进程会“同时”执行(在多核CPU上可能真的是同时,或者在单核上通过时间片轮转给它们的执行效果看起来像是同时的)。

但要记住,无论父子进程谁先运行,sleep(1); 会让执行到它的那个进程休眠1秒,不是说父进程会等子进程休眠。实际上,父子进程是互不影响的,除非你用了进程间通信或者同步机制来协调它们。

这就是为什么有时候看起来即使你用了 sleep(),父进程还是会先执行的原因。

这是一个使用 wait() 的示例代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

void main (void) {
    int x = 5;
    int t = fork();
    if (t > 0) {
        // 父进程等待子进程结束
        wait(NULL);
        x += 30;
        printf("Parent: %d\n", x);
    } else if (t == 0) {
        // 子进程
        printf("Child: %d\n", x);
    }
    // 注意:这里的输出会在父子进程中都执行
    printf("Final: %d\n", x);
}

在上述代码中,如果是父进程执行,则会调用 wait() 函数等待子进程结束。子进程会立即执行并打印出 x 的值,然后结束。一旦子进程结束,父进程从 wait() 返回,然后继续执行并打印修改后的 x 值。最后的 printf("Final: %d\n", x); 会在父子进程中都执行,因此您会在终端中看到两次输出(另一次是子进程的 x 值)。

这样,即使没有使用 sleep(),父进程也会等待子进程完成其输出。最终的 printf 会在每个进程中执行,因此您会看到输出两次。

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧