【elfboard linux开发板】4. 文件点灯与创建多进程
ps:提升效率的小tips:
灵活运用vim操作命令,gg快速跳转到文件开头,G跳转到结尾
多行操作ctrl + V
shift + i
插入修改内容
esc退出编辑sudo vi /etc/vim/vimrc
在文件中添加如下内容省略重复工作:
autocmd BufNewFile *.c,*.cpp,*.h,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if &filetype == 'c'
call setline(1,"#include <unistd.h>")
call append(line(".")," ")
call append(line(".")+1,"int main(int args,char*argv[])")
call append(line(".")+2,"{")
call append(line(".")+3," ")
call append(line(".")+4,"}")
endif
endfunction
1.文件
以下命令都可以在vim编辑器里,通过在命令模式下2K跳转查询;也可以在终端中man 2 命令
查询
a. int open( const char *pathname, int flags,[mode_t mode])
返回值:成功返回文件描述符,失败返回-1
flags参数可以填写: O_RDONLY, O_WRONLY, O_RDWR分别表示只读、只写、可读可写, O_CREAT 没有就创建该文件
mode参数与flags参数有关,如果flags参数为O_CREAT, 该参数为新建文件的权限值,一般用8进制位传入,方便阅读;且与外部umask掩码有关,权限为mode-umask
需要包含下面头文件:
#include <fcntl.h>
#include <sys/stat.h>
b. ssize_t read(int fd, void *buf, size_t count)
返回值:成功返回读取的字符长度,0说明读到了文件的结尾,失败返回-1,并且设置errno
errno 函数头文件 #include <errno.h>
输出错误信息:perror("error is ")
fd : 文件描述符
读取count个字符放到buf中
c. int close(int fd)
返回值:成功返回0,失败返回-1,并设置errno
关闭文件
/*
读文件 输出到终端
*/
#include<stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(int args,char* argv[]){
int fd = open(argv[1], O_RDONLR);
if(fd==-1){
perror("open error");
exit(1);
}
int len;
char buf[1024];
while((len=read(fd,buf,sizeof(buf)))!=0){
if(len==-1){
perror("read error");
exit(1);
}
for(int i=0;i<len;i++){
printf("%c",buf[i]);
}
printf("\n");
}
close(fd);
return 0;
}
d. ssize_t write(int fd, const void *buf, size_t count)
作用:向文件描述符fd指向的文件,写入count个buf其实地址开始的字符;
返回值:成功返回写入成功的字节数,错误返回-1,且设置errno
e. off_t lseek(int fd, off_t offset, int whence)
作用:将光标移到whence位置
offset: 偏移位置
whence常用参数:
SEEK_SET: 移动到设置的offset位置
SEEK_CUR: 移动到现在光标+offset位置
SEEK_END:移到到文件末尾+offset位置
f. dup2(int oldfd, int newfd)
作用:用newfd指向oldfd文件描述符
/*
文件名:file_write_arm.c
作用:写文件与显示写入内容
author: LiuGuoyong
date:2023/12/27
*/
#include<stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(int args,char* argv[]){
int fd = open(argv[1], O_WRONLY|O_CREAT,0777);
int fd2 = open(argv[2], O_WRONLY|O_CREAT,0777);
char buf[2] = {'1','0'};
dup2(STDOUT_FILENO,fd); //将fd指向了标准输出,向fd中写入会直接显示到终端中
if(fd==-1){
perror("open fd error");
exit(1);
}
if(fd2==-1){
perror("open fd2 error");
exit(1);
}
while(1){
lseek(fd,0,SEEK_SET);
lseek(fd2,0,SEEK_SET);
write(fd,buf,1);
write(fd2,&buf[1],1);
sleep(2);
lseek(fd,0,SEEK_SET);
lseek(fd2,0,SEEK_SET);
write(fd,&buf[1],1);
write(fd2,buf,1);
sleep(2);
}
close(fd);
close(fd2);
return 0;
}
2. 进程
- pid_t fork()创建子进程
返回值:0:子进程,-1:失败,并且生成errno,>0: 子进程pid号 - waitpid(pid_t pid,int *wstatus, int options)回收子进程
pid:-1 任意子进程
< < <-1 回收进程组id等于 pid的绝对值
0 子进程创建过程
> > > 0 子进程pid号 - pid_t getpid() 获取进程id
/*
名称:pid_arm.c
*/
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
int main(void){
pid_t pid;
int i = 0;
for(;i<5;i++){
if((pid = fork())==0)
break;
}
if(i == 5){
sleep(5);
waitpid(-1,NULL,0);
printf("pid is %d\n",getpid());
}
else{
sleep(i);
printf("pid is %d\n",getpid());
}
return 0;
}
编译发送同前;
效果:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!