码迷,mamicode.com
首页 > 系统相关 > 详细

『Shell编程』学习记录(2)

时间:2019-04-10 00:46:18      阅读:179      评论:0      收藏:0      [点我收藏+]

标签: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_TRUNCopen()应首先删除文件中的内容,然后开始编写。
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;
}:

 

参考:https://stackoverflow.com/questions/49040262/o-trunc-in-system-call-open-not-actually-deleting-contents-of-file

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]。

『Shell编程』学习记录(2)

标签:value   ios   ack   actual   sync   style   overflow   else   dwr   

原文地址:https://www.cnblogs.com/xueyou/p/Shell2.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!