创建三个进程
可以让父进程创建一个子进程,再由父进程或者子进程创建一个子进程
#include <myhead.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();
if (pid >0)
{
//父进程
pid_t pid1 = fork();
if (pid1 >0)
{
printf("father\n");
}else if (pid1 == 0)
{
printf("child 2\n");
sleep(8);
printf("c2 run\n");
exit(EXIT_SUCCESS);
}
}
else if (pid ==0)
{
printf("child 1\n");
sleep(5);
printf("c1 run\n");
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
wait(NULL);
wait(NULL);
printf("f\n");
sleep(3);
return 0;
}
写时拷贝技术
特殊进程的验证
僵尸进程验证
子进程已经退出,但其父进程未为其收尸(回收资源)
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork(); //创建出子进程
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
printf("我是子进程\n");
exit(EXIT_SUCCESS); //退出子进程
}
//父进程内容
printf("我是父进程\n");
sleep(5);
return 0;
}
孤儿进程验证
父进程结束,子进程还在
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork(); //创建出子进程
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid > 0)
{
printf("我是父进程\n");
exit(EXIT_SUCCESS); //退出子进程
}
//父进程内容
printf("我是子进程\n");
sleep(5);
return 0;
}
创建守护进程
守护进程相当于一个服务,不依赖于任何终端而存在,随着系统的动而启动,终止而结束
守护进程制作流程:
1)创建子进程,让其成为孤儿进程:fork exit
2)将自己设置为会话组组长,不依赖终端:setsid
#include <unistd.h>
pid_t setsid(void);
功能:设置当前进程的id号为会话组组长
参数:无
返回值:新的会话组id号,失败返回-1并置位错误码
3)更改操作目录为根目录:chdir
#include <unistd.h>
int chdir(const char *path);
功能:设置当前进程操作的目录
参数:要操作的目录
返回值:成功返回0,失败返回-1并置位错误码
4)设置文件操作权限:umask
5)将将标准输入、输出、出错文件描述符重定向到指定文件中:dup2
#include <myhead.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();
if (pid < 0)
{
perror("fork");
return -1;
}else if (pid > 0)
{
exit(EXIT_SUCCESS);
}
setsid(); //设置会话组组长
chdir("/");
umask(0);
int fd = open("./log.txt",O_WRONLY|O_APPEND|O_CREAT,0664);
if (-1 ==fd)
{
perror("open");
}
dup2(fd,STDIN_FILENO);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO); //标准输入输出出错 重定向到文件
while (1)
{
printf("hello\n"); //此时为全缓存
fflush(fd);
sleep(1);
}
close(fd);
return 0;
}