我在一个系统上工作,其中交换被禁用,内存过量使用被禁用。
假设我的进程当前消耗了100MB内存,而系统可用内存不足100MB。
如果我执行fork(),会不会因为内核也尝试为子进程分配100MB而失败?
我读到过Linux在分叉时使用写时复制,所以孩子和父母共享所有的页面。所以我猜fork应该成功了?
假设fork成功,假设我在调用exec()之前在子进程中有几行代码。因此,父进程和子进程将继续共享文本段,除非子进程接触到任何堆内存,否则内存使用不会有任何变化。这是正确的吗?
Edit: One follow-up question: With swapping/overcommit disa
我查看了函数(),试图了解fork()如何返回父进程的子PID和子进程的0。
我认为nr包含子进程的PID (将返回给调用进程),但我看不出它如何能够将0返回到子进程。
答案说,返回值是在为新进程创建的堆栈上传递的,但是(除了并不真正理解它)我在代码中找不到这个值。
因此,,其中为子进程?设置了0的返回值。
_do_fork()函数的代码复制如下:
long _do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
我想用vfork()写一个程序,并且parent创建n个子对象,我想用参数插入一些子对象。然后我想把儿子的数量加起来,例如:
./sum 4
The sum of the child: 10
The sum of the parent: 10
(1+2+3+4)
这是我想出来的一小段代码,但是我得到了无限循环。
int n = atoi(argv[1]);
int i = 1;
pid_t pid;
int sumchild = 0;
int sumparent = 0;
while(i <= n){
pid = vfork();
if(pid