linux基础——fork()和文件操作

                    fork()复制进程和对文件的操作

pid 唯一标识一个进程
pid_t pid = fork();复制一个子进程,子进程的pid都是0.
写时拷贝:复制过程会将父进程中需要进行修改的内存复制一份给子进程,不需要修改的内存暂时不进行复制。

僵死进程:子进程先于父进程结束,父进程没有获取到子进程的退出码。一般可以使用wait()来解决,但是这种方法会导致父进程阻塞。

孤儿进程:父进程先结束,子进程会没有父进程,此时系统会默认将init(pid==1)进程作为此类进程的父进程。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>

int main()
{
	char *s = NULL;
	int n = 0;
	pid_t pid = fork();//复制出一个子进程
	assert(pid!=-1);
	if(pid == 0)//如果pid是0,则是子进程执行
	{
		s = "child";
		n = 3;
	}
	else//父进程执行
	{
		s = "father";
		n = 7;
	}
	int i = 0;
	for(;i<n;i++)//父子进程都进行打印操作
	{
		printf("s = %s\n,pid = %d",s,getpid());
	}
	exit(0);
}

在这里插入图片描述

按照代码逻辑,子进程打印三次应该就结束了,但是图中可以看出子进程打印了三次还在运行。
这是因为父进程没有获取到子进程的退出码,可以利用wait()解决,只需要在父进程操作中加入wait(NULL)就可以,但是会导致父进程阻塞,父进程会等子进程执行结束才开始。
在这里插入图片描述
为了使父子进程并发运行也可以使用信号
signal(SIGCHLD,SIG_IGN)

fopen库函数 open内核
系统调用操作文件
打开open 写write 读read 关闭close
文件权限:只读方式打开O_WRONLY 只写O_RDONLY 读写O_RDWR
int fd(文件描述符) = open("./file.txt",O_WRONLY|O_CREAT,0600);//在当前路径下创建文件,写,打开,权限:rw
write(fd,“hello”,5);//文件,字符,字符数
char buff[128] = {0};
read(fd,buff,127);//文件,读入的地方,字符数
fd的值是3,因为在开始写文件时,0号下标stdin(标准输入),1号下标stdout(标准输出),2号下标stderr(标准错误输出)
可以利用文件的读写操作进行文件的复制

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>

int main(char* argv[]){
	int fdr = open(argv[1],O_RDONLY);
	int fdw = open(argv[2],O_WRONLY|O_CREAT,0600);
	if(fdr == -1 || fdw == -1){
		printf("file error");
		exit(0);
	}
	char buff[256] = {0};//大小可以根据自己需要定义
	int tmp = read(fdr,buff,255);
	if(tmp>0){
		write(fdw,buff,tmp);
	}
	close(fdr);
	close(fdw);
}

Linux代码中主函数的参数查看
//参数个数 argc(至少有一个)
//参数内容 argv(文件名就是其中一个)
//环境变量 envp

int main(int argc,char *argv[],char *envp[]){
	printf("argc=%d\n",argc);//打印函数个数
	int i = 0;
	for(;i<argc;i++){
		printf("argv[%d]=%s\n",i,argv[i]);//打印函数内容
	}
	for(i = 0;envp[i] != NULL;i++){
		printf("envp[%d]=%s\n",i,envp[i]);打印环境变量
	}
	exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有头发的小小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值