Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,变量如何存储两个值?_C_Linux_Ipc_Multitasking - Fatal编程技术网

在C语言中,变量如何存储两个值?

在C语言中,变量如何存储两个值?,c,linux,ipc,multitasking,C,Linux,Ipc,Multitasking,我决定学习C语言,下面是我使用的其中一本书的片段: #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { pid_t result = fork(); if (result == -1){ fprintf(stderr, "Error\n"); return 1; } if (result ==

我决定学习C语言,下面是我使用的其中一本书的片段:

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

int main()
{
    pid_t result = fork();

    if (result == -1){
        fprintf(stderr, "Error\n");
        return 1;
    }

    if (result == 0)
        printf("I'm a child with PID = %d\n", getpid());
    else
        printf("I'm a parent with PID = %d\n", getpid());

    return 0;
}

一切都很清楚,但怎么可能是result==0和result!=同时0?看起来这个变量存储了两个值,因为printf指令执行了两次。我知道,fork返回0和父项的PID,但是result如何检查它在不同条件下是否返回true?

一个变量一次只能保存一个值。您所看到的发生是因为fork正在创建另一个进程:现在有两个程序实例正在运行;一个在其中result==0生成的进程,另一个在其中result!=0原始进程,因为它不是同一个变量。当您分叉一个流程时,您将得到两个完全不同的流程,有关详细信息,请参见

因此,父对象中的结果变量与子对象中的结果变量不同。您看到的是两个进程,都连接到同一个输出设备,每个进程都编写自己的消息

事实上,fork文档具体包括:

成功时,子进程的PID在父进程中返回,0在子进程中返回

因此,您可以像使用fork一样使用返回值来查看您是父级还是子级,以及它是否工作正常,如果失败,它将返回-1,您将是没有子级的父级

其思想是,父进程获取子进程的进程ID,这样它就可以对它执行一些操作,比如等待它完成,子进程就得到零。子进程总是可以通过调用getppid来获取父进程的进程ID。

fork从父进程复制子进程。因此,新创建的子对象从父对象继承了几个属性,如共享内存、消息队列、文件流等。因此,当您调用fork时,将创建另一个具有另一个变量结果的进程。

fork函数将创建一个新进程,在此行之后,您的程序将从该点拆分为2。因为您需要知道自己是哪个进程,如果您是子进程,函数将返回0,如果您是父进程,函数将返回一些pid

从手册页:

成功时,子进程的PID将在父进程中返回,并且 在子级中返回0。失败时,在父级中返回-1, 未创建任何子进程,并且已正确设置errno


fork函数将创建一个新进程。在父进程中,fork将返回子进程的pid,因此结果变量将不等于0,而在子进程中,fork只返回0,因此结果为0

系统调用用于创建进程。它不接受任何参数,并返回一个进程ID。加上关键字短语…它不是同一个变量。
I'm a parent with PID = 5228
I'm a child with PID = 5229