linux fork多进程 demo

注释

  • 使用系统调用fork()创建三个子进程;
  • 各个子进程显示和输出一些提示信息和自己的进程标识符;
  • 父进程显示自己的进程ID和一些提示信息,然后调用waitpid()等待多个子进程结束,并在子进程结束后显示输出提示信息表示程序结束。

代码

#include <iostream>
#include <unistd.h>
#include <cstdarg>
#include <wait.h>
#include "crypto_util.h"

int get_file(const std::string file_name){
    size_t get_file_id = 0;
    std::cout << hsm::common::get_md5_digest_hex(file_name) << std::endl;
    get_file_id = strtol(reinterpret_cast<const char *>(hsm::common::get_md5_digest_hex(file_name).substr(0,7).c_str()), nullptr, 16);
    return get_file_id;
}
int tprintf(const char *fmt,...){
    va_list args;
    struct tm* t_struct;
    time_t t_sec;
    t_sec = time(nullptr);
    t_struct = localtime(&t_sec);
    printf("%02d:%02d:%02d:%5d|",t_struct->tm_hour,t_struct->tm_min,t_struct->tm_sec,getpid());
    va_start(args,fmt);
    return vprintf(fmt,args);
}
int main(void) {
    std::cout << "Start!" << std::endl;
    printf("Father progress,PID is %d.\n",getpid());
    pid_t pid1 = fork();
    if(pid1 == 0){
        printf("Children progress 1,PID is %d.\n",getpid());
        exit(1);
        printf("Children progress 1 over.\n");
    }

    pid_t pid2 = fork();
    if(pid2 == 0){
        printf("Children progress 2,PID is %d.\n",getpid());
        exit(1);
        printf("Children progress 1 over.\n");
    }

    pid_t pid3 = fork();
    if(pid3 == 0){
        printf("Children progress 3,PID is %d.\n",getpid());
        exit(1);
        printf("Children progress 1 over.\n");
    }

    else if (pid1 != -1 ){
        tprintf("Parent forked children process-- %d.\n",pid1);
        tprintf("Parent is waiting for child to exit.\n");

        waitpid(pid1,NULL,0);
        waitpid(pid2,NULL,0);
        waitpid(pid3,NULL,0);
        tprintf("Child Process had exited.\n");
        tprintf("Parent had exited.\n");
    } else{
        tprintf("Everything was done without error.\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CHYabc123456hh/article/details/112124958