有人可以解释为什么第一个代码变量“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()以及里面的内容。
最佳答案
fork 新进程会创建原始进程的独立且不同的副本。更改流程副本中的某些内容不会更改原始流程中的任何内容。
线程是不同的,它们共享一切。所有线程仍然是同一进程的一部分。
而clone
系统调用可以创建一个新进程(这就是在 Linux 中实际调用 fork
时发生的情况),它也可以用于创建一个线程,这就是第二个程序中发生的情况。
关于c - 理解涉及进程的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601791/