C/Cpp Fork

2019/05/31 C/CPP

C/CPP的fork机制总结

序言

之前虽然对C的fork机制有所了解, 但是时间一长就有点忘了,现在来做个总结。先提出以下一些问题:

  • C中return 和exit有何不同?

    return 会返回到上一层调用的地方, 而exit会使得进程直接退出

  • C 中父进程fork出子进程和父进程, 子进程如何执行?

    父进程,子进程都会执行fork命令的下一条指令, fork在父进程中返回子进程pid(创建成功时), 在子进程中返回0, 当fork() == 0子进程中使用return 后, 子进程就会与父进程执行除fork限定(用fork 调用控制执行的代码)外的代码, 此时的情况需要特别注意。

    可以阅读 fork 调用的原理。

  • Linxu 程序的存储空间安排?

  • Linux Fork进程时的COW技术?父进程和子进程的逻辑地址, 物理地址?

  • 父子进程A, B使用不同的信号处理函数 但是父子A,B进程公用同一个stat个参数, 子进程B退出(被kill)时, 父进程A也退出,(程序结构main ->fork A, A fork B), 未解之谜😂, 可以实现一个这样的程序, 重现一下, 了解下stat参数的作用, 阅读资料, wait/waitpid函数

test code:

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
pid_t          pid;
int            restart_flag = 0;
int data1 = -99;
void sig_chld(int signo)
{
    pid_t   pid;
    int     stat;
    while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
    {
        printf("pid:%ld crash, caught signal:%d\n",pid, signo);
        restart_flag = 1;    
    }
       
    return;
}
  
void child_func(){ 
	printf("child_func,  pid:%ld, ppid:%ld, data1=%d\n", getpid(), getppid(), data1);
        sleep(1);
	exit(0);
} 


int main() 
{
    restart_flag = 0; 
    int data_share_test = -99;
    if((pid = fork()) < 0)  
        return -1;
    else if(pid == 0){
        child_func();
    }
    signal(SIGCHLD, sig_chld);
    while(1){
        if(restart_flag == 1){
             if((pid = fork()) < 0) 
                return -1;
            else if(pid == 0)
            {
                 child_func();
            }
            restart_flag = 0; 
        }
	printf("pid:%ld, ppid:%ld, data1=%d\n", getpid(), getppid(), data1);
	data1++;
        sleep(3); 
    } 
    return 0; 
} 

Search

    Categories Cloud

    Life Linux C/CPP Database Web Benchmarks Software Data Python TCP/IP Financial Stock Bug Golang Rust General Infrastructure TODO Movie Multitenancy Java Ant Algorithm Fastjson Death Build Deploy Education India Aamir Khan Society Female Learning Method OJ Interviewee Interviewer AVL Tree MyBatis Code Reading Design Diary Dating Heap Data Structure Summary Reading Love Claire Mcfall Ferryman Zodiac Astrology Chinese Calculator flink Dubbo docker redis

    Table of Contents