fork() 到底发生了什么
What exactly happens with fork()?
int main(){
char ch;
fork();
cin >> c;
}
调用 fork(( 后,我应该有 2 个确切的进程运行相同的代码。为什么在运行这个简单示例后,我被要求只输入一个字符一次,要么两次?每次运行此程序时,系统不应该期望 2 个输入吗?
>./a.out
a
>./a.out
a
b
>
您有两个进程同时从终端读取。 任何人都可以猜测哪个进程获得输入。
- 如果父进程首先获取输入,它将退出并将控制权返回给 shell。 (请注意,这实际上会导致相同情况的重复,shell 和子进程争夺输入。
- 如果子进程首先获取输入,它将退出,但在父进程退出之前,控件不会返回到 shell。
如果有两个进程从同一终端读取,则不应期望一致的行为。
当调用fork((时,操作系统通常会复制正在执行的程序的整个内存空间(有点(。然后,两个程序都会运行。唯一的区别是,在"新"进程中,fork(( 返回 0,而在"旧"进程中,它返回新进程的进程 ID。
只要求您输入一个输入的原因是其中一个程序在后台运行。命令行外壳一次只对一个进程执行 I/O。
fork(( 创建一个子进程。
但是哪个进程(在父进程和新生子项之间(获得CPU切片尚未确定。当两个进程都被阻止键盘输入时,子进程或父进程都可以获取输入。如果父级获取令牌,它将输入读入其地址空间中定义的变量并退出。孩子从来没有机会从输入中阅读。然后,这个孤立的子进程将被"根"进程(pid=1(采用。请参阅ps
输出。
在另一种情况下,子项获取令牌并读取数据并退出,父项仍处于活动状态,因此再次阻止输入。
在fork((之后包含一个wait((并尝试。
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 让对象知道它创建的 show 函数中发生了什么
- 这里的矢量数组发生了什么?
- 增加顶级常量指针时发生了什么
- 当另一端将其关闭时,插座发生了什么
- C :我堆栈顶部发生了什么
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 这个 std::vector 构造函数中发生了什么
- 编译器认为 int 是一个字符串.发生了什么事情
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?