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;

}



相关文章
|
15天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
26 1
|
5天前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
18 3
|
8天前
|
算法 Linux 调度
Linux进程——进程的创建(fork的原理)
Linux进程——进程的创建(fork的原理)
11 2
|
14天前
|
安全 开发者 Python
Python中的多线程与多进程编程
Python作为一种广泛使用的编程语言,在处理并发性能时具有独特的优势。本文将深入探讨Python中的多线程与多进程编程技术,分析其原理和应用,帮助读者更好地理解并发编程在Python中的实现与优化。
|
25天前
|
安全 Java 程序员
深入理解Java并发编程:从基础到高级深入理解操作系统中的进程调度策略
【5月更文挑战第29天】 Java并发编程是Java开发中不可忽视的一部分,它涉及到多线程、同步、锁等概念。本文将带你从Java并发编程的基础概念出发,逐步深入到高级应用,让你全面掌握Java并发编程的技巧。
|
19天前
|
存储 Unix Linux
Linux多进程编程详解
进程反应了进程执行的变化。 进程的状态分为三种 ,`运行态`,`阻塞态`,`就绪态` 在五态模型中分为以下几种,新建态,就绪态,运行态,阻塞态,终止态。 运行态:进程占用处理器正在运行。 就绪态:进程已具备运行的条件,等待系统分配处理器运行。 阻塞态 :又称为等待(`wait`)态,或睡眠(`sleep`)态,指进程不具备运行条件,正在等待事件的完成。 新建态:进程已被创建,还未加入就绪队列。
9 0
Linux多进程编程详解
|
12天前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之函数计算里中FC出现函数还没有执行完进程就关闭了是什么导致的
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
Linux Shell 程序员
【进程控制】进程程序替换的原理以及exec函数族
【进程控制】进程程序替换的原理以及exec函数族
|
1月前
|
存储 算法 Unix
【创建进程】fork函数与写时拷贝
【创建进程】fork函数与写时拷贝
|
18小时前
|
缓存 监控 安全
Linux top命令详解:持续监听进程运行状态
Linux top命令详解:持续监听进程运行状态
12 3

热门文章

最新文章

相关实验场景

更多