标签:value ios ack actual sync style overflow else dwr
例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[1]); int fdt,fds; char buf[20]; int num = 0; if ((fds = open("/etc/profile",O_RDONLY)) < 0) { printf("open fail\n"); } if ((fdt = open(argv[1],O_CREAT|O_TRUNC|O_RDWR) < 0) { printf("open fail\n"); return 1; } while (1) { if ((num = read(fds,buf,20)) < 0) { printf("read fail\n"); } if (write(fdt,buf,num) < 0) { printf("write fail\n"); return 1; } if (num != 20) { break; } } close(fds); close(fdt); return 0; }
① 这些常数的定义,在/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, 1); read(fp, &c2, 1); close(fp); fp = open("file.txt", O_TRUNC | O_WRONLY); if (c2 == ‘\n‘) c1 -= 3; else { if (c2 >= ‘0‘ && c2 <= ‘2‘ ) { c1--; c2 += 7; } else c2 -= 3; } if (c1 != ‘0‘) write(fp,&c1,1); if (c2 != ‘\n‘) write(fp,&c2,1); write(fp,&c3,1); return 0; }:
②
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[2]; pid_t pid; char buf_r[100]; char* p_wbuf = "hello world!"; int r_num = 0; memset(buf_r, 0, sizeof(buf_r)); if (pipe(pipe_fd) < 0) { printf("pipe create error\n"); return -1; } if ((pid = fork()) == 0) { close(pipe_fd[1]); sleep(2); if ((r_num = read(pipe_fd[0], buf_r, 100)) > 0) { printf("%d numbers read from the pipe is \" %s \"\n", r_num, buf_r); } close(pipe_fd[0]); exit(0); } else if (pid > 0) { close(pipe_fd[0]); if (write(pipe_fd[1], p_wbuf, strlen(p_wbuf)) != -1) { printf("parent write \" %s \" success!\n", p_wbuf); } close(pipe_fd[1]); sleep(3); waitpid(pid, NULL, 0); exit(0); } }
①
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,‘-‘,6); puts (str); return 0; }
Output:
------ every programmer should know memset! |
②
pipe(filedes)的功能: 建立一无名管道。管道建立后,写进程将数据写入文件 filedes[1],读进程 从文件 filedes[0]中读数据,从而实现读/写进程的管道通信。
例程的功能是将p_wbuf指向的100个内存单元通过pipe传给buf_r[100]。
标签:value ios ack actual sync style overflow else dwr
原文地址:https://www.cnblogs.com/xueyou/p/Shell2.html