Linux进程管理

(一)题目描述

  1. 用 fork()创建两个子进程
    分别在父进程和子进程中打印进程号、父进程号、进程组号和会话号。
  2. 在第一个子进程中,创建一个新的会话,打印新的进程组号和会话号;调用
    execl,运行命令“ls –l /home”
  3. 在第二个子进程中,调用 atexit()注册退出处理函数 exit_child(),在 exit_child()
    中打印进程 ID。
  4. 在父进程中调用 on_exit()注册退出处理函数 exit_parent(),传参为“parent”,
    在 exit_parent()中打印进程 ID 和退出处理函数接收到的参数。
  5. 父进程调用 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;
}

(三)运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值