UC编程6-目录操作和创建子进程fork()函数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>//消息队列

//operatordir6.c

#include "myuc.h"
void test1()
{
	DIR* dir=opendir("./");
	if(dir==NULL) perror("opendir"),exit(-1);
	struct dirent * ent;
	while(ent=readdir(dir))//
	{
		//类型4:目录,8:文件
		printf("type:%d,name:%s\n",ent->d_type,ent->d_name);
	}
}
//递归显示目录
void print(const char* name){
	printf("dir:[%s]\n",name);	
	DIR* dir=opendir(name);
	if(dir==NULL) {perror("opendir");return;}
	struct dirent * ent;
	while(ent=readdir(dir))//
	{
		//类型4:目录,8:文件
			if(ent->d_type!=4)
			{
				printf("type:%d,name:%s\n",ent->d_type,ent->d_name);
			}
			else if(ent->d_type==4&& strcmp(ent->d_name,".")
					&&strcmp(ent->d_name,".."))
			{
			//printf("dir:[%s]\n",ent->d_name);
			char pd[256]={};
			strcpy(pd,name);
			if(name[strlen(name)-1]!='/') strcat(pd,"/");
			//拼接子目录相对地址
			strcat(pd,ent->d_name);
			strcat(pd,"/");
			//printf("pd:%s\n",pd);
			print(pd);
			}
	}
}
int main()
{
	//test1();
	print("../c");
	return 0;
}

//fork6.c

#include "myuc.h"
void test1()
{
	pid_t pid=fork();//调用一次返回两次,
	//如果当前进程是父进程,则返回子进程id,如果当前是子进程 ,则返回0
	if(pid==0) {//子进程
		   sleep(2);	
			printf("1子进程id:%d\n",getpid());
			printf("1父进程id:%d\n",getppid());
	}
	else{
			printf("2父进程id:%d\n",getpid());
			printf("2子进程id:%d\n",pid);
	}
	sleep(1);//如果父进程运行完毕退出了,子进程的父进程会变化。
	//return 0;
}
int i=10;
void test2()
{
	int i2=10;
	int *pi=malloc(4);
	*pi=10;//fork之前,复制的变量,地址一样的
	pid_t pid=fork();
	int i4=10;//fork之后,不是复制,地址可能不一样
	if(pid==0){
		i=20;i2=20;*pi=20;i4=20;
		printf("1:i=%d,i2=%d,*pi=%d,i4=%d\n",
						i,i2,*pi,i4);
		printf("1:%p,%p,%p,%p\n",&i,&i2,pi,&i4);
		exit(0);//退出子进程
	}
		printf("2:i=%d,i2=%d,*pi=%d,i4=%d\n",
						i,i2,*pi,i4);
		printf("2:%p,%p,%p,%p\n",&i,&i2,pi,&i4);

	sleep(2);
}
void test3()
{
	pid_t pid=fork();
	int fd=open("a.txt",O_RDWR|O_CREAT,0700);
	if(fd==-1) perror("open"),exit(-1);
	//pid_t pid=fork();
	if(pid==0){
		write(fd,"abc",3);
		close(fd);
		exit(0);
	}
		write(fd,"def",3);
		close(fd);
	sleep(1);
}

int main()
{
	test1();
	//test2();
	//test3();
	return 0;

}



相关文章
|
Shell Linux C语言
函数和进程之间的相似性
在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。
211 0
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
834 13
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
252 4
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
缓存 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`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。

热门文章

最新文章