2

我不明白子进程如何返回值以及返回给谁?

输出为 6, 7 ;问题来源:http ://www.cs.utexas.edu/~mwalfish/classes/s11-cs372h/hw/sol1.html

Program 1: 
main() 
{ 
    val = 5; 
    if(fork()) 
    wait(&val); 
    val++; 
    printf("%d\n", val); 
    return val; 
}
4

4 回答 4

5

主要工艺:

val = 5; 
wait(&val); // wait until child finishes

子进程:

val++; // val becomes 6
printf("%d\n", val); // prints 6
return val; // return val back to main process

主要工艺:

wait(&val); // val becomes 6
val++; // val becomes 7
printf("%d\n", val); // prints 7
return val; 
于 2012-12-13T07:16:26.277 回答
1
if(fork()) 

创建一个子进程。每个进程都会获得一份var. fork在父进程中返回一个非零值。所以if只为父进程执行。并且wait只为父进程调用。它等待子进程完成执行。

子进程增量val打印它并返回。一旦它返回父进程恢复并通过递增var、打印它的值然后从它返回来进一步执行main()

于 2012-12-13T07:15:18.713 回答
1

Afork()基本上创建了一个新进程。这意味着将复制所有当前值。这也得出结论,val在您的父进程中不是val在您的子进程中。这就是您必须以某种方式与子进程进行通信的原因,您可以使用wait.

      父进程 | 子进程
---------------------------|---------- -----
主要() |
{ | #########################
    整数值 = 5;| // int val = parent.val;
** int tmp = fork(); | ** int tmp = 0;
    if(tmp) // 真 | if(tmp) // 假
        等待(&val); | // 不使用等待
        // 等到 | 验证++;// 值 = 6
        // 子进程 | printf("%d\n", val);
        // 返回。| 返回值;// 返回 6
        // 保存返回 | ###########|############
        // val 中的值 <---------------+
    验证++;// 值 = 7 | #########################
    printf("%d\n", val); | #########################
    返回值;| #########################
}

每当一个进程在 Linux 中退出时,返回值都是临时存储的。只要父进程没有得到这个存储值,子进程仍然被列为僵尸。该值可以通过 获取wait。所以每当你return <value>在你的应用程序结束时使用wait()你的调用者都会给你这个返回值。

于 2012-12-13T07:33:48.240 回答
1

The above output is wrong.

Main process:


val = 5; 
wait(&val); // wait until child finishes

Child process:

val++; // val becomes 6
printf("%d\n", val); // prints 6
return val; // return val*256 back to main process

Main process:

wait(&val); // val becomes 6
val++; // val becomes 1792+1=1793
printf("%d\n", val); // prints 1793
return val; 

The above output is right if you add one line in a code !

Program 1: 
main() 
{ 
    val = 5; 
    if(fork()) 
    wait(&val); 

val=val/256 // if you add this line then the above output is correct

    val++; 
    printf("%d\n", val); 
    return val; 
}

it is due to

#define WEXITSTATUS(status) (((status)>>8) & 0xFF)
于 2018-03-27T20:22:33.137 回答