『Shell编程』学习记录(2)
例1.文件io
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int main(int argc, char **argv) {
printf("%s\n",argv[]);
int fdt,fds;
char buf[];
int num = ;
if ((fds = open("/etc/profile",O_RDONLY)) < ) {
printf("open fail\n");
}
if ((fdt = open(argv[],O_CREAT|O_TRUNC|O_RDWR) < ) {
printf("open fail\n");
return ;
}
while () {
if ((num = read(fds,buf,)) < ) {
printf("read fail\n");
}
if (write(fdt,buf,num) < ) {
printf("write fail\n");
return ;
}
if (num != ) {
break;
}
}
close(fds);
close(fdt);
return ;
}
① 这些常数的定义,在/usr/include/bits/fcntl.h
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100 /* not fcntl */
#define O_EXCL 0200 /* not fcntl */
#define O_NOCTTY 0400 /* not fcntl */
#define O_TRUNC 01000 /* not fcntl */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000
可以看出,每个常数都对应一位。所以按位或得到的值,每多或上一个常数,就是把对应的一位置1。
O_TRUNC
在open()
应首先删除文件中的内容,然后开始编写。
file.txt中包含ASCII '11',它应该做的是读取它并将其覆盖为'8',文件最终为'8'。
代码的目标是读取文件中的数字,将其减3,然后仅使用系统调用将该数字放回文件中。
#include <unistd.h>
#include <fcntl.h> int main(int argc, char*argv[]){ int fp = open("file.txt", O_RDONLY);
char c1, c2, c3='\n'; read(fp, &c1, );
read(fp, &c2, );
close(fp);
fp = open("file.txt", O_TRUNC | O_WRONLY); if (c2 == '\n')
c1 -= ;
else {
if (c2 >= '' && c2 <= '' ) {
c1--;
c2 += ;
}
else
c2 -= ; }
if (c1 != '')
write(fp,&c1,);
if (c2 != '\n')
write(fp,&c2,);
write(fp,&c3,);
return ;
}:
②
void open (const char* filename,
ios_base::openmode mode = ios_base::in | ios_base::out);
对filename进行后面的操作组合
参考:http://www.cplusplus.com/reference/fstream/basic_fstream/open/
例程的功能是将 /etc/profile 文件每20个字节进行读取到 arg[1] (没有则重新创建,有则进行内容覆盖)文件中。
例2.进程间通信
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char **argv) {
int pipe_fd[];
pid_t pid;
char buf_r[]; char* p_wbuf = "hello world!";
int r_num = ; memset(buf_r, , sizeof(buf_r)); if (pipe(pipe_fd) < ) {
printf("pipe create error\n");
return -;
}
if ((pid = fork()) == ) {
close(pipe_fd[]);
sleep();
if ((r_num = read(pipe_fd[], buf_r, )) > ) {
printf("%d numbers read from the pipe is \" %s \"\n", r_num, buf_r);
}
close(pipe_fd[]);
exit();
}
else if (pid > ) {
close(pipe_fd[]);
if (write(pipe_fd[], p_wbuf, strlen(p_wbuf)) != -) {
printf("parent write \" %s \" success!\n", p_wbuf);
}
close(pipe_fd[]);
sleep();
waitpid(pid, NULL, );
exit();
} }
①
void * memset ( void * ptr, int value, size_t num );
将ptr指的内存的num个字节用value设置set。
/* memset example */
#include <stdio.h>
#include <string.h> int main ()
{
char str[] = "almost every programmer should know memset!";
memset (str,'-',);
puts (str);
return ;
}
Output:
------ every programmer should know memset! |
②
pipe(filedes)的功能: 建立一无名管道。管道建立后,写进程将数据写入文件 filedes[1],读进程 从文件 filedes[0]中读数据,从而实现读/写进程的管道通信。
例程的功能是将p_wbuf指向的100个内存单元通过pipe传给buf_r[100]。
『Shell编程』学习记录(2)的更多相关文章
- 『Shell编程』学习记录(1)
例1. $ cat ex1 date pwd cd .. $ bash ex1 # 运行,显示当前日期和当前目录,但没有执行返回上级目录,因为执行的时候终端会产生一个子shell(类似于C语言调用函数 ...
- 『C编程』学习笔记(1)
size_t类型详解: #include <cstddef> #include <iostream> #include <array> int main() { s ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- linux shell编程进阶学习(转)
第一节:基础 ls -lh ——可以用户友好的方式看到文件大小 file 文件名 ——查看文件类型 stat 文件名 ——查看文件当前状态 man 命令/函数名 ——查看详细的帮助文档 man中看某 ...
- Linux下C语言编程基础学习记录
VIM的基本使用 LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...
- Linux Unix shell 编程指南学习笔记(第三部分)
第十三章 登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...
- 《灰帽Python-黑客和逆向工程师的Python编程》学习记录
ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书 ...
- android adb shell and monkey 学习记录
Monkey环境: android SDK and JDK SDK目录下的platform-tools和tools目录要配置环境变量 查看版本: ADB 的安装这里就不多说了,输入以下命令有如下提示就 ...
- Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍 此章节内容较为简单,跳过. 第十七章 条件測试 test命令 expr命令 test 格式 test condition 或者 [ conditio ...
随机推荐
- String字符串类总结
object类 int hashCode() Object定义的hashCode方法能为不同对象返回不同的整数.实际上是把JVM给对象分配的地址转化为整数,确保了逻辑上的唯一性.而转化的散列算法,可能 ...
- css块级元素和行内元素详细解析
块级元素和行内元素是布局中常见的两种基本元素,但是未必有很多人深入的研究它们的细微差别. 常见块级元素:div p form ul ol li 等: 常见的行内元素:span stronh em; ...
- ReactiveSwift源码解析(六) SignalProtocol的take(first)与collect()延展实现
上篇博客我们聊了observe().map().filter()延展函数的具体实现方式以及使用方式.我们在之前的博客中已经聊过,Signal的主要功能是位于SignalProtocol的协议延展中的, ...
- Quartz简单实现定时任务管理(SSM+Quartz)
首先你得有一个用Maven搭好的SSM框架,数据库用的Mysql,这里只有关于Quartz的部分.其实有大神总结的很好了,但做完后总有些地方不一样,所以写这篇作为笔记.这里先把大神的写的分享给大家:h ...
- 在WebStorm里配置watcher实现编辑less文件时自动生成.map和压缩后的.css文件
[文件(File)]-[设置(Settings)]-[工具(Tools)]-[File Watchers]-[+]-[Less]打开New Watcher配置界面. https://blog.csdn ...
- linux-Navicat 连接数据库 报错10060 & Navicat连接报错1146
1.mysql数据库设置远程连接权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;[回 ...
- 7. VIM 系列 - 程序员利器(语法检测、代码块补全、symbol管理、函数跳转)
目录 1. 语法检查利器 ale 2. 补全代码块 3. symbol 管理器 taglist.vim 4. 函数跳转 1. 语法检查利器 ale 安装 ale Plug 'w0rp/ale' 配置 ...
- JS正则表达式匹配域名 网址 URL
DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明
缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...
- Openresty编写Lua代码一例
1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...