(一)题目描述
- 用 fork()创建两个子进程
分别在父进程和子进程中打印进程号、父进程号、进程组号和会话号。 - 在第一个子进程中,创建一个新的会话,打印新的进程组号和会话号;调用
execl,运行命令“ls –l /home” - 在第二个子进程中,调用 atexit()注册退出处理函数 exit_child(),在 exit_child()
中打印进程 ID。 - 在父进程中调用 on_exit()注册退出处理函数 exit_parent(),传参为“parent”,
在 exit_parent()中打印进程 ID 和退出处理函数接收到的参数。 - 父进程调用 waitpid()等待第二个子进程结束,打印 waitpid()的返回值,并且
用宏 WIFEXITED 判断子进程是否正常退出。
(二)代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/errno.h>
#include<stdlib.h>
void exit_child(int status,void *arg){
printf("exit_child function\n");
printf("pid:%d\n",getpid());
}
void exit_parent(int status,void *arg){
printf("exit_parent function\n");
printf("pid:%d\n",getpid());
printf("arg = %s\n",(char *)arg);
}
int main(int argc,char *argv[])
{
int i,pid,pid2,pid3;
int status;
int pid_wait;
char *str="parent";
printf("\t pid \t ppid \t pgid \t sid\n");
printf("parent \t %d \t %d \t %d \t %d\n",getpid(),getppid(),getpgid(0),getsid(0));
pid =fork();
if(pid!=0){
pid2 = fork();
if(pid2==0){
printf("child \t %d \t %d \t %d \t %d\n",getpid(),getppid(),getpgid(0),getsid(0));
setsid();
printf("after setsid:\n");
printf("\t %d \t %d \t %d \t %d\n",getpid(),getppid(),getpgid(0),getsid(getpid()));
printf("after ls -l home\n");
execl("/bin/ls","ls","-l","/home",(char *)0);
}
on_exit(exit_parent,(void *)str);
}else{
printf("child \t %d \t %d \t %d \t %d\n",getpid(),getppid(),getpgid(0),getsid(0));
pid_wait = waitpid(getpid(),&status,0);
if(WIFEXITED(status)){
printf("wait on pid %d,normal exit,return value is %4x\n",pid_wait,WEXITSTATUS(status));
}else if(WIFSIGNALED(status)){
printf("wait on pid %d,recive signal,return value is:%4x\n",pid_wait,WIFSIGNALED(status));
}
atexit(exit_child);
exit(4321);
}
return 0;
}
(三)运行结果