『Shell编程』学习记录

Posted xueyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『Shell编程』学习记录相关的知识,希望对你有一定的参考价值。

例1.文件io

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **argv) {
    printf("%s
",argv[1]);
    int fdt,fds;
    char buf[20];
    int num = 0;
    if ((fds = open("/etc/profile",O_RDONLY)) < 0) {
        printf("open fail
");
    }
    if ((fdt = open(argv[1],O_CREAT|O_TRUNC|O_RDWR) < 0) {
        printf("open fail
");
        return 1;
    }
    while (1) {
        if ((num = read(fds,buf,20)) < 0) {
            printf("read fail
");
        }
        if (write(fdt,buf,num) < 0) {
            printf("write fail
");
            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=
;

    read(fp, &c1, 1);
    read(fp, &c2, 1);
    close(fp);
    fp = open("file.txt", O_TRUNC | O_WRONLY);

    if (c2 == 
)
        c1 -= 3;
    else {
        if (c2 >= 0 && c2 <= 2 ) {
            c1--;
            c2 += 7;
        }
        else
            c2 -= 3;

    }
    if (c1 != 0)
        write(fp,&c1,1);
    if (c2 != 
)
        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
");
        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 "
", 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!
", 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编程』学习记录的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

Shell编程入门

大数据学习初体验:Linux学习+Shell基础编程+hadoop集群部署

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

常用python日期日志获取内容循环的代码片段

ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段