【elfboard linux开发板】4. 文件点灯与创建多进程

ps:提升效率的小tips:

灵活运用vim操作命令,gg快速跳转到文件开头,G跳转到结尾

多行操作

ctrl + V

shift + i

插入修改内容

esc退出编辑

sudo vi /etc/vim/vimrc

在文件中添加如下内容省略重复工作:

bash 复制代码
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

关闭文件

c 复制代码
/*
读文件 输出到终端
*/
#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文件描述符

c 复制代码
/*
文件名: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. 进程

  1. pid_t fork()创建子进程
    返回值:0:子进程,-1:失败,并且生成errno,>0: 子进程pid号
  2. waitpid(pid_t pid,int *wstatus, int options)回收子进程
    pid: -1 任意子进程

    < < <-1 回收进程组id等于 pid的绝对值

    0 子进程创建过程
    > > > 0 子进程pid号

  3. pid_t getpid() 获取进程id
c 复制代码
/*
名称: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;
}

编译发送同前;

效果:

相关推荐
Apipi*7 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP8 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC10 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding10 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK10 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil20811 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)11 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter62511 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida12 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
zly350013 小时前
centos7 mount设备挂载 /dev/sda1/硬盘挂载
linux·运维·服务器