/* * 3-8.c * * Created on: 2011-1-7 * Author: jinyong * 阻塞式终止子进程 */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void display0(); void display1(); void display2(); int main() { pid_t result; int status,select,num; void (*fun[3])(); //利用函数指针建立三个子函数 fun[0]=display0; fun[1]=display1; fun[2]=display2; printf("1.复制进程/n2.不复制进程/n请输入您的选择:"); scanf("%d",&select); if(select == 1) { result = fork(); if(result == -1)//进程创建失败 { perror("复制进程失败"); exit(1); }else if(result == 0) //子进程 { printf("这是子进程%d,父进程号:%d/n",getpid(),getppid()); printf("进入思科1912交换机界面/n"); printf("1 user now active on Management Console/n"); printf("/tUser Interface Menu/n"); printf("/t[0] Menus/n"); printf("/t[1] Command Line/n"); printf("/t[2] IP Configuration/n"); printf("Enter Selection:"); scanf("%d",&num); if(num >= 0 && num <= 2) { (*fun[num])(); } exit(0); }else //父进程 { waitpid(result,&status,0);//父进程调用waitpid函数,消除僵尸进程 /** * pid_t waitpid(pid_t pid, int *status, int options); * pid:子进程号 * status:子进程状态 * options可以为0或后面的or组合 * WNOHANG:如果每一任何已终止的子进程则马上返回。 * WUNTRACED:如果子进程进入暂停执行则马上返回,但终止状态不予理会。 * 执行成功则返回子进程号,失败返回-1,失败原因存于errno中。 * waitpid会暂停目前进程的执行,直到有信号来到或子进程终止。 */ printf("这是父进程%d,父进程号是:%d/n",getpid(),getppid()); if(WIFEXITED(status) == 0) printf("子进程非正常终止,子进程终止状态%d/n",WIFEXITED(status)); else printf("子进程正常终止,子进程终止状态%d/n",WIFEXITED(status)); exit(0); } }else{ printf("您选择了不复制进程/n"); } return 0; } void display0() { printf("您选择进入了菜单模式/n"); } void display1() { printf("您选择了进入命令行模式/n"); } void display2() { printf("您选择了进入IP地址配置模式/n"); }