<C-z>、fg命令

博客记录了使用vim编辑文件的操作,具体为停止当前操作后,使用vim编辑a目录下的菜根谭.txt文件,体现了在信息技术中使用文本编辑器进行文件编辑的场景。
vim a/菜根谭.txt    「 <C-z> 暂停 」 
  • [1]+  Stopped                 vim a/菜根谭.txt
ls a/
fg    「 唤醒 」 
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #include <ctype.h> #define MAX_INPUT 1024 #define MAX_ARGS 64 // 全局变量记录当前前台进程PID pid_t foreground_pid = 0; // 信号处理器 //设置sigint_handler函数为终止当前的前台进程 void sigint_handler(int sig) { if (foreground_pid != 0) { kill(foreground_pid, SIGKILL); printf("\n"); } } // 设置sigtstp_handler函数为暂停当前的前台进程 void sigtstp_handler(int sig) { if (foreground_pid != 0) { kill(foreground_pid, SIGTSTP); printf("\n[%d] stopped\n", foreground_pid); foreground_pid = 0; } } // 解析输入命令 //将命令行输入input字符串分割成args数组,并返回args数组的长度argc,argc通常会被用来 //调用execvp函数执行外部命令。 int parse_command(char *input, char **args) { int argc = 0; char *token = strtok(input, " \t\n"); while (token != NULL && argc < MAX_ARGS - 1) { args[argc++] = token; token = strtok(NULL, " \t\n"); } args[argc] = NULL; // execvp要求以NULL结尾 return argc; } // 执行外部命令bckground=0表示前台执行,background!=表示后台执行 void execute_external(char **args, int background) { int pipefd[2]; if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid < 0) { perror("fork"); return; } else if (pid == 0) { // 子进程执行命令 close(pipefd[0]); dup2(pipefd[1], STDOUT_FILENO); close(pipefd[1]); if (execvp(args[0], args) < 0) { perror("execvp"); exit(EXIT_FAILURE); } } else { // 父进程处理 if (!background) { printf("前台进程[%d]\n", pid); foreground_pid = pid; int status; waitpid(pid, &status, 0); foreground_pid = 0; close(pipefd[1]); char buf[1024]; ssize_t count; while ((count = read(pipefd[0], buf, sizeof(buf)-1)) > 0) { buf[count] = '\0'; printf("%s", buf); } close(pipefd[0]); waitpid(pid, NULL, 0); } else { printf("后台进程[%d]\n", pid); close(pipefd[1]); close(pipefd[0]); } } } // 内置命令处理 int handle_builtin(char **args, int argc) { if (strcmp(args[0], "exit") == 0) { exit(EXIT_SUCCESS); } else if (strcmp(args[0], "stop") == 0 && argc > 1) { pid_t pid = atoi(args[1]); if (kill(pid, SIGTERM) == 0) { printf("Stopped process %d\n", pid); } else { perror("kill"); } return 1; } return 0; // 不是内置命令 } int main() { char input[MAX_INPUT]; char *args[MAX_ARGS]; // 设置信号处理器 //SIGINT(也就是ctrl+c)绑定函数sigint_handler(终止当前前台进程) //SIGTSTP(也就是ctrl+z)绑定函数sigtstp_handler(暂停当前前台进程) signal(SIGINT, sigint_handler); signal(SIGTSTP, sigtstp_handler); while (1) { printf("mysh> "); fflush(stdout); // 读取输入 ctrl+d退出 if (fgets(input, MAX_INPUT, stdin) == NULL) { break; // 处理EOF (Ctrl+D) } // 解析命令 int argc = parse_command(input, args); if (argc == 0) continue; // 空命令 // 检查后台执行 int background = 0; if (argc > 0 && strcmp(args[argc-1], "&") == 0) { background = 1; args[argc-1] = NULL; argc--; } // 处理内置命令 if (handle_builtin(args, argc)) { continue; } // 执行外部命令 execute_external(args, background); } return EXIT_SUCCESS; } 修改上述代码,要求实现如下功能:1.前台进程,子进程通过管道将输出写入父进程,父进程打印,ctrl+z可以将前台进程暂停到后台进程。2.后台进程,在后台进行,通过stop命令可以杀死后台进程。3.通过jobs可以查看后台进程。4.通过bg与fg可以实现前后台进程切换。
08-07
#include <stdio.h> #include <stdint.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/i2c-dev.h> #define ADDRESS_MPU6050 0x68 // 默认从机地址 #define REG_ACCEL_XOUT_H 0x3B // 开始读取加速度计数据寄存器 #define ACCEL_SCALE_FACTOR (float)(16384.0) // 打开指定的 I2C 设备并选中从机地址 int open_i2c_device(const char *filename, uint8_t address) { int file; if ((file = open(filename, O_RDWR)) < 0) { perror("Error opening I2C device"); return -1; } if (ioctl(file, I2C_SLAVE, address) < 0) { perror("Error setting I2C slave address"); close(file); return -1; } return file; } // 从指定寄存器开始连续读取字节 uint8_t read_register(int fd, uint8_t reg_addr, uint8_t length, uint8_t *data) { if (write(fd, &reg_addr, 1) != 1) { // 发送寄存器地址 perror("Error writing register address"); return 1; } if (read(fd, data, length) != length) { // 读取长度为 'length' 字节数组 perror("Error reading from register"); return 1; } return 0; } int main() { const char *device_file = "/dev/i2c-1"; // 连接到第一个 I2C 总线 int file_desc; // 初始化 I2C 总线 if ((file_desc = open_i2c_device(device_file, ADDRESS_MPU6050)) < 0) return 1; printf("Connected to MPU6050 via %s at address 0x%X.\n", device_file, ADDRESS_MPU6050); // 测试读取加速度计 X 轴、Y 轴、Z 轴原始数据 uint8_t buffer[6]; // 存储六个字节(每个轴两个字节) float x_accel, y_accel, z_accel; while(1){ sleep(1); // 每隔一秒采样一次 if(read_register(file_desc, REG_ACCEL_XOUT_H, sizeof(buffer), buffer)){ break; // 出现错误中断循环 } // 计算各轴数值 (单位g),注意高位在前低位在后 x_accel = (((buffer[0] << 8) | buffer[1]) / ACCEL_SCALE_FACTOR ); y_accel = (((buffer[2] << 8) | buffer[3]) / ACCEL_SCALE_FACTOR ); z_accel = (((buffer[4] << 8) | buffer[5]) / ACCEL_SCALE_FACTOR ); // 显示结果 printf("\rX=%.2fg\tY=%.2fg\tZ=%.2fg ", x_accel,y_accel,z_accel); } close(file_desc); }
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值