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);
}