c/c++ linux 进程 fork wait函数

linux 进程 fork wait函数

fork:创建子进程

wait:父进程等待子进程结束,并销毁子进程,如果父进程不调用wait函数,子进程就会一直留在linux内核中,变成了僵尸进程。

fork函数的详细说明:fork

wait函数详细说明参考:wait

例子1:不注释掉exit(0)的话,子进程不会执行到printf("end pid: %d\n", getpid());这行。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>//wait function

int main(){
  pid_t pid;

  pid = fork();

  if(pid == 0){
    printf("child process : %d\n", getpid());
    //exit(0);
  }
  else{
    int status;
    pid_t waitpid;

    printf("parent process : childpid=%d , mypid=%d\n",pid, getpid());
    waitpid = wait(&status);
    printf("waitpid:%d\n", waitpid);
  }
  printf("end pid: %d\n", getpid());
  return 0;
}

github源代码

例子2:父进程和子进程之间,值是不共有的,你是你的,我是我的。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
  pid_t pid;
  int i = 100;

  pid = fork();

  if(pid == 0){
    printf("child process : %d\n", getpid());
    i += 500;
  }
  else{
    printf("parent process : childpid=%d , mypid=%d\n",pid, getpid());
    i += 1024;
  }
  printf("i=%d\n", i);

  return 0;
}

github源代码

例子3:线程之间,值是共有的。

#include <stdio.h>
#include <unistd.h>//sleep function
#include <pthread.h>

int global_val = 0;

void* sub_thread(void *data){
  int* val = (int*)data;

  printf("sub_thread : val=%d\n", *val);

  for(int i = 0; i < 10; ++i){
    global_val++;
    printf("sub_thread : i=%d, g=%d\n", i, global_val);
    sleep(1);
  }
  return NULL;
}

int main(){
  pthread_t th;
  void* th_ret;
  int arg = 200;
  
  if(pthread_create(&th, NULL, sub_thread, (void*)&arg) != 0){
    perror("pthread_create");
    return 1;
  }

  for(int i = 0; i < 10; ++i){
    global_val++;
    printf("main: i=%d, g=%d\n", i, global_val);
    sleep(1);
  }

  if(pthread_join(th, &th_ret) != 0){
    perror("pthread_join");
    return 1;
  }

  return 0;
}

github源代码

编译时需要加 -pthread

g++ -g process-5-thread.cpp -std=c++11 -pthread

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

posted @ 2018-10-18 07:02  小石王  阅读(3438)  评论(0编辑  收藏  举报