UC编程7-进程创建函数fork/vfork 和 execl/信号signal的使用1

简介: //myuc.h #include//io流#include//标准库#include//uc标准头文件#include//文件控制#include//c字符串#include#include//内存映射#include//文件...

//myuc.h

#include<stdio.h>//io流
#include<stdlib.h>//标准库
#include<unistd.h>//uc标准头文件
#include<fcntl.h>//文件控制
#include<string.h>//c字符串
#include<sys/types.h>
#include<sys/mman.h>//内存映射
#include<sys/stat.h>//文件状态信息
#include<sys/wait.h>//进程等等
#include<dirent.h>//目录操作
#include<signal.h>//信号
#include<sys/time.h>//时间,计时器
#include<sys/ipc.h>//ipc进程间通信
#include<sys/shm.h>//共享内存段
#include<sys/msg.h>//消息队列

//exitwiat7.h

#include "myuc.h"
void fun_exit()//退出之前要执行的函数
{
	sleep(1);
	printf("call exit\n");
}
void testexit()
{
	atexit(fun_exit);//注册退出前调用的函数
	printf("begin\n");
	
	//_exit(0);//立即退出
	//exit(0);//在这里退出,退出前调用atexit()注册的函数
	printf("end\n");
	
}
void testwait()
{
	pid_t pid=fork();
	if(pid==0){
			printf("子进程%d运行\n",getpid());
			sleep(2);
	exit(120);
	}
	printf("父进程等待\n");
	int status;
	pid_t wpid=wait(&status);
	printf("结束等待\n");
	printf("wpid=%d\n",wpid);
	if(WIFEXITED(status)){
	printf("正常退出,退出码:%d\n",WEXITSTATUS(status));
	}
}
void testwaitpid()
{
	pid_t pid1,pid2;
	pid1=fork();
	if(pid1>0){
	pid2=fork();
	}
	if(pid1==0){
		printf("process 1:%d\n",getpid());
		sleep(2);
			printf("process 1:%dend\n",getpid());
		exit(100);
	}
	else{
		sleep(3);
	}
	if(pid2==0)
	{
		printf("process 2:%d\n",getpid());
		sleep(1);
		printf("process 2:%dend\n",getpid());
		exit(200);
	}
	else{
		sleep(3);
	}
	int status;
	waitpid(-1,&status,0);//0为阻塞等待,WNOHANG为不阻塞
	if(WIFEXITED(status)){
		printf("exitcode:%d\n",WEXITSTATUS(status));
	}
	printf("end\n");
	
}
int main()
{
	//testexit();
	//testwait();
	testwaitpid();
	return 0;//退出前调用atexit()注册的函数
}

//proc7.c

#include "myuc.h"
int main()
{
	printf("pid=%d\n",getpid());
	sleep(3);
	printf("over\n");
}
////gcc proc7.c -o proc

//vfork7.c

#include "myuc.h"
void test1()
{
	pid_t pid=vfork();
	if(pid==0)
	{
		printf("子进程运行\n");
		sleep(2);
		printf("子进程结束\n");
		exit(0);
	}
	printf("父进程结束\n");

}
int main()
{
	test1();	
	return 0;
}

//vforkexec7.c

#include "myuc.h"
void test1()
{
	pid_t pid=vfork();//vfork()创建全新进程,占用父进程空间
	//vfork()和exec结合使用才有意义
	//execl("/bin/ls","ls","-l","./",NULL);
	if(pid==0)
	{
		printf("子进程运行%d\n",getpid());
		sleep(2);
		printf("子进程结束\n");
		printf("子进程调用execl(),归还父进程空间\n");
		//execl("/bin/ls","ls","-l","./a.out",NULL);
		execl("./proc","proc",NULL);//execl成功后,
									//后面语句在execl失败才执行
		printf("execl()结束\n");
		exit(0);//归还父进程空间
	}
	printf("父进程结束\n");

}
int main()
{
	test1();	
	return 0;
}

//signal7.c

#include "myuc.h"
void fa(int signum)
{
	printf("接收到的信号:%d\n",signum);
}
void test1()
{
	printf("pid=%d\n",getpid());
	signal(SIGINT,fa);//修改SIGINT信号的处理方式为自定义处理
	signal(SIGQUIT,SIG_IGN);//修改SIGQUIT信号的处理方式为忽略
	if(signal(SIGFPE,fa)==SIG_ERR){//是否注册成功
		perror("signal"),exit(-1);
	}
	while(1);
}
int main()
{
	test1();
	return 0;
}


相关文章
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
2276 14
|
Shell Linux C语言
函数和进程之间的相似性
在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。
198 0
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
796 13
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
242 4
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
编译器
【收藏】内核级利用通用Hook函数方法检测进程
【收藏】内核级利用通用Hook函数方法检测进程
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
1614 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能

热门文章

最新文章