分类 默认分类 下的文章

write.c

/* write.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <string.h>

#define SHM_SIZE 1024

int main()
{
    int shmid;
    char *shmaddr;
    char write_buf[SHM_SIZE];

    // 创建共享内存段
    shmid = shmget((key_t)1234, SHM_SIZE, 0666|IPC_CREAT);
    if (shmid == -1) {
        perror("shmget failed");
        exit(EXIT_FAILURE);
    }

    // 将共享内存段连接到当前进程
    shmaddr = (char*)shmat(shmid, 0, 0);
    if (shmaddr == (void*)-1) {
        perror("shmat failed");
        exit(EXIT_FAILURE);
    }

    // 从标准输入读取数据并将其写入共享内存
    while(1) {
        fgets(write_buf, SHM_SIZE, stdin);
        strncpy(shmaddr, write_buf, SHM_SIZE);
        if (strncmp(write_buf, "exit", 4) == 0) {
            break;
        }
    }

    // 断开共享内存连接
    if (shmdt(shmaddr) == -1) {
        perror("shmdt failed");
        exit(EXIT_FAILURE);
    }

    // 删除共享内存段
    if (shmctl(shmid, IPC_RMID, 0) == -1) {
        perror("shmctl failed");
        exit(EXIT_FAILURE);
    }
    
    printf("write exit\n");

    return 0;
}

read.c

/* read.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <string.h>

#define SHM_SIZE 1024

int main()
{
    int shmid;
    char *shmaddr;
    char read_buf[SHM_SIZE];

    // 获取共享内存段
    shmid = shmget((key_t)1234, SHM_SIZE, 0666|IPC_CREAT);
    if (shmid == -1) {
        perror("shmget failed");
        exit(EXIT_FAILURE);
    }

    // 将共享内存段连接到当前进程
    shmaddr = (char*)shmat(shmid, 0, 0);
    if (shmaddr == (void*)-1) {
        perror("shmat failed");
        exit(EXIT_FAILURE);
    }

    // 从共享内存读取数据并输出到标准输出
    while(1) {
        strncpy(read_buf, shmaddr, SHM_SIZE);
        printf("Received message: %s\n", read_buf);
        if (strncmp(read_buf, "exit", 4) == 0) {
            printf("Received exit\n");
            break;
        }
        sleep(1);
    }

    // 断开共享内存连接
    if (shmdt(shmaddr) == -1) {
        perror("shmdt failed");
        exit(EXIT_FAILURE);
    }

    printf("read exit\n");
    
    return 0;
}

为何又要学习编程

  • 高级编程语言是掌控电脑底层的最佳手段
  • shell受限于作者,虽然有源码,不能畅快理解最是难受。

收获

  1. C语言的函数可以参考 int main(){};
  2. 枚举和结构具有高度相似性 enum day{}DAY; struct{}a;
  3. 分清地址&与变量,对指针而言,访问指针名得到的是地址,*才是访问指针指向的具体内容。p = &a;(p被定义为指针名,a是变量,&a是变量地址),p指针名本身是地址,与&a等价。
  4. 传入指针方式,传入地址与内容替换(指针必须用*)两种

typecho

  • 用于记录,使用md格式
  • 占用端口8000

navidrome

  • 音乐文件管理,页面很漂亮
  • 占用端口4533

read3.0 web服务

  • 用于txt阅读,页面也很漂亮
  • 占用端口8080

目前使用systemd-nspawn 容器管理上述服务

nano /etc/systemd/nspawn/*.nspawn(*是容器名称)
...

下一个服务

基于tccli的ddns服务,用于对外服务

基于systemd-nspawn的服务可以在不同linux发行版中无缝转移

主体

  • navidrome

上传机制

  • 网盘的webdav在本地挂载,使用cloudreve本地运行,以socket套接字作为挂载点iooh
  • ddns更新ipv6

数据库选择

  • 不再使用sqlite,使用比较高效的mariadb或pgsql,尽量使用pgsql

核心

编辑profile

termux 的profile

/data/data/com.termux/files/usr/etc/profile
在最后加上:

for a in /data/data/com.termux/files/usr/etc/profile.d/a/*.sh; do
        if [ -r $a ]; then
                . $a
        fi
done
#a可以用其它变量名代替,复制自profile本身,放在最后。重点在dir 'a'
unset a
取消变量
mkdir/data/data/com.termux/files/usr/etc/profile.d/a

在该目录下添加脚本,我的是:

sshd &
unset LD_PRELOAD
proot -r ./archlinuxarm -0 -w / -b /dev -b /proc -b /sys /bin/env -i /bin/bash --login
#用于启动Linux环境,这里是archlinuxarm