理解C涉及进程的代码

时间:2018-04-01 19:20:55

标签: c

有人可以解释为什么第一个代码变量" v"不要改变最后一个prinft()的值和第二个代码变量" v"变化

第一个代码:

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

int v = 5;

int main(){

    pid_t piid;

    piid = fork();

    if(piid==0){
        v += 15;
        return 0;
    }
    else if(piid >0){
        wait(NULL);
        printf("Final value = %d\n",v);
        return 0;
    }
}

我知道这段代码涉及fork()以创建另一个进程,可能

第二段代码:

#define _GNU_SOURCE
#include <stdlib.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <sched.h>
#include <stdio.h>

// 64kB stack
#define FIBER_STACK 1024*64

int v = 5;

int threadFunction( void* argument )
{
    v += 10;
    return 0;
}

int main(){
    void* stack;
    pid_t pid;


    stack = malloc( FIBER_STACK );
    if ( stack == 0 )
    {
        perror("malloc: could not allocate stack\n");
        exit(1);
    }



    pid = clone( &threadFunction, (char*) stack + FIBER_STACK,
    SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM, 0 );
    if ( pid == -1 )
    {
        perror( "clone" );
        exit(2);
    }


    pid = waitpid( pid, 0, 0 );
    if ( pid == -1 )
    {
        perror( "waitpid" );
        exit(3);
    }


    free( stack );
    printf("Final value = %d\n", v);

    return 0;
}

这段代码是一个线程,但我无法理解所谓的clone()及其内部的内容。

2 个答案:

答案 0 :(得分:0)

分叉新进程会创建原始进程的独立且不同的副本。更改流程副本中的某些内容不会改变原始流程中的任何内容。

线程不同,他们分享一切。所有线程仍然是同一进程的一部分。

虽然clone系统调用可以创建一个新进程(实际上在Linux中调用fork时会发生什么),但它也可以用来创建一个线程,这就是第二个程序

答案 1 :(得分:0)

线程在共享内存空间中运行,而进程在不同的内存空间中运行。 所以在第一种情况下使用fork时,每个进程都有不同的变量v引用,而在线程中都有相同的引用。