⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 linux中演示如何产生子进程
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

//Global signal handler function
void signal_handler(int iSignal)
{
    switch(iSignal)
    {
    case SIGCHLD:
    {
        //receive SIGCHLD signal, indicated child process exit.
        int iChildProcessID = wait(NULL);
        if(iChildProcessID)
        {
            printf("Child process already exit.\n");
        }
    }
    break;
    default:;
    }
}

int main(int argc, char **argv)
{
    system("clear");
    
    //对输入的命令行参数个数进行有效性校验
    if(argc < 3)
    {
        printf("Input error!\n");
        printf("\n\tformat:./main outputfile string\n");
        printf("\n\texample:./main hello.txt Helloworld\n");
        return EXIT_FAILURE;
    }
    
    printf("In parent process...\n");
    
    char szErrorText[255] = {0};

    //register SIGCHLD signal handler function
    struct sigaction sa;
    sa.sa_handler = signal_handler;
    sigfillset(&sa.sa_mask);
    sa.sa_flags = SA_NOMASK;
    sigaction(SIGCHLD, &sa, NULL);

    //1、创建子进程,并在子进程中执行读文件程序
    //2、父进程中创建指定的输出文件,并向输出文件中写入指定的数据供子进程读取
    pid_t iChildProcessID = fork();
    if(iChildProcessID == -1)
    {
        //create child process failure
        perror("Parent process create child process.");
        return EXIT_FAILURE;
    }
    else if(iChildProcessID == 0)
    {
        //in child process
        char *pszArgList[] = {"./read",argv[1],argv[2],0};
        printf("Create child process success, now is startting target program...\n");
        sleep(1);
        execlp("./read","./read",argv[1],argv[2],0);
    }
    else
    {
        //in parent process
        FILE *pFile = fopen(argv[1],"w+");
        if(!pFile)
        {
            memset(szErrorText,0,255);
            snprintf(szErrorText,255,"Parent process create outputfile \"%s\" failure.\n",argv[1]);
            perror(szErrorText);
        }
        else
        {
            printf("Parent process create outputfile \"%s\" success.\n",argv[1]);
            
            int iWriteBytes = fwrite(argv[2],strlen(argv[2]),1,pFile);
            if(iWriteBytes == EOF)
            {
                memset(szErrorText,0,255);
                snprintf(szErrorText,255,"Parent process write data to \"%s\" failure.\n",argv[1]);
                perror(szErrorText);
            }
            else
            {
                printf("Parent process write data to \"%s\" success.\n",argv[1]);
            }
            
            fclose(pFile);
            pFile = NULL;
        }
        
        printf("Parent process waitting for child process exit...\n");
        
        //等待子进程结束,如果不等待子进程结构,则子进程将由init进程托管变成僵尸进程
        pause();
        
        printf("Parent process exit.\n");
    }//if(iChildProcessID == -1)
    
    return EXIT_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -