一个关于fork的思考
- #include<stdio.h>
- #include<sys/types.h>
- #include<unistd.h>
- int i=5;
- int main()
- {
- int j;
- pid_t pid;
- //pid = fork();//子进程是从fork后的语句开始执行的,所以这样起不到创建两个子进程的效果
- for(j=0; j<2; j++)
- {
- //pid = fork();//请思考为什么fork不能放在循环里,
- pid = vfork();//请比较此例中创建两个子进程和下例中用递归创建有什么不同
- switch(pid)
- {
- case 0:
- i++;
- printf("CP is run\n");
- printf("%d\n%d\n",i,getpid());
- break;
- case -1:
- perror("pc failed");
- break;
- default:
- printf("PP is run\n");
- printf("%d\n%d\n",i,getpid());
- break;
- }
- }
- exit(0);
- }
递归,可创建多个子进程
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
-
- pid_t pid;
-
- /*
- * num:当前已经创建的子进程数
- * max:需要创建的子进程数
- */
- void createsubprocess(int num,int max)
- {
- if(num>=max)return;
- pid=fork();
- if(pid<0)
- {
- perror("fork error!\n");
- exit(1);
- }
- //子进程
- else if(pid==0)
- {
- sleep(3);
- printf("子进程id=%d,父进程id=%d\n",getpid(),getppid());
- }
- //父进程
- else
- {
- num++;
- if(num==1)printf("父进程id=%d\n",getpid());
- if(num<max)createsubprocess(num,max);
- //此处加sleep是为了防止父进程先退出,从而产生异常
- sleep(5);
- }
- }
-
- int main()
- {
- int num=0;
- int max=3;
- createsubprocess(num,max);
- return 0;
- }
创建守护进程(递归)
- #include<stdio.h>
- #include<sys/types.h>
- #include<unistd.h>
- #include<signal.h>
- #include<sys/param.h>
- #include<sys/stat.h>
- #include<time.h>
- #include<syslog.h>
- int init_daemon(void)
- {
- int pid;
- int i;
- signal(SIGTTOU,SIG_IGN);
- signal(SIGTTIN,SIG_IGN);
- signal(SIGTSTP,SIG_IGN);
- signal(SIGHUP,SIG_IGN);
- //两次创建子进程,使得进程不再是会话组长从而脱离控制终端
- pid = fork();
- if(pid>0)
- {
- exit(0);
- }
- else if(pid<0)
- {
- return -1;
- }
- setsid();
- pid = fork;
- if(pid>0)
- {
- exit(0);
- }
- else if(pid<0)
- {
- return -1;
- }
- //关闭0到最高文件进程描述符值
- for(i=0; i<NOFILE; close(i++));
- chdir("/");
-
- umask(0);
- signal(SIGCHLD,SIG_IGN);
- return 0;
- }
- int main()
- {
- time_t now;
- init_daemon();
- syslog(LOG_USER | LOG_INFO,"测试守护进程!\n");
- while(1)
- {
- sleep(8);
- time(&now);
- syslog(LOG_USER | LOG_INFO,"系统时间:\t%s\t\t\n",ctime(&now));
- }
- }
创建进程扇/进程链:
进程扇:/* 由一个进程派生多个子进程 */
进程链:/* 由父进程派生子进程,子进程再派生子进程 */
请思考3个问题:
1.怎样保证父子进程的执行顺序
2.sleep的作用到底是什么?
3.break能不能换成return(0)?它们之间有什么区别?
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- int main(void)
- {
- int i;
- pid_t pid;
- printf("This is a example\n");
- for (i=0 ;i<3; i++)
- {
- if (!(pid = fork()) //创建进程扇(让子进程跳出)
- // if ( pid = fork()) //创建进程链(让父进程跳出,子进程作为后继的父进程)
- break;
- }
- printf ("("My parent pid is %ld,My pid is %ld\n",getpid(),getppid());
- sleep(3);//等待所有的进程执行完毕
- return 0;
- }
阅读(914) | 评论(0) | 转发(0) |