📄 main.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 + -