【问题标题】:C processes: fork() scopeC 进程:fork() 作用域
【发布时间】:2018-04-21 12:28:37
【问题描述】:

我正在尝试准确了解如何使用流程。更具体地说,运行什么代码,什么不运行。我已经编写了一些示例代码来尝试解释我不理解的内容。

int main(){

  //Program code part 1

  int myfun(){
    if(fork()>0){

      //Program code part 2

    }
    return 0;
  }
  //Program code part 3

}

据我了解,父进程应该执行代码部分 1 和 3,并在 myfun() 中返回 0。孩子应该执行第2部分,绝对不是第1部分。它会执行第3部分吗?因为它是在 myfun() 的范围内创建的,所以我认为不会,但我真的很想在弄乱我的程序之前确定一下。

【问题讨论】:

  • myfunmain 内部定义。我相信 gcc 有一个扩展来支持这个(它不是标准的),但无论哪种方式你都不会调用那个函数。
  • 你已经定义了 myfun inside main - 你不能在 C 中这样做。你能 edit 澄清这个问题吗? main 是否调用 myfun
  • C 不允许嵌套函数定义。
  • 您的代码无效。 C 不允许您将一个函数的定义(即myfun())嵌套在另一个函数的定义中(main())。在这种情况下,我们只能说你错了:你提供的代码甚至都不会编译,更不用说运行了,不依赖扩展。
  • 哇!那是我们四个人,大约一分钟后都发表了相同的评论。

标签: c process scope fork


【解决方案1】:

一个成功的fork 会返回两次——一次在父进程中使用>0 pid,一次在子进程中使用0。然后两者都从那一点继续前进。

就控制流而言,这就是它的全部内容。

如果您的代码是:

int myfun()
{
    if(fork()>0){
        //Program code part 2
    }
    return 0;
}
int main()
{
    //Program code part 1
    myfun();
    //Program code part 3
    return 0;

}

然后父级将运行第 2 部分,父级和子级都将运行第 3 部分(除非 fork() 调用失败并返回 -1,在这种情况下没有子级)。

如果你想限制孩子,在应该结束的地方做_exit(SomeExitCode)

( _exit 在分叉进程中通常优于 exit,因为后者 fflushes stdio 流 并调用atexit 处理程序,所有这些对于一个有 它的文件描述符和进程映像从父级复制。)

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多