2024-08-13

在Linux系统中,套接字(socket)是一种允许进程进行网络通信的机制。套接字可以支持不同的网络协议,例如TCP和UDP。

在编写网络应用程序时,首先需要创建一个套接字,然后绑定到一个特定的地址和端口上,接着进行监听,最后处理客户端的连接和数据传输。

以下是一个简单的TCP服务器和客户端的例子,使用了基本的套接字编程概念:

服务器端代码(server.c):




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char *greeting = "Hello from server";
 
    // 创建一个套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
 
    // 绑定地址和端口
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);
 
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
 
    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
 
    // 接受客户端连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
 
    // 接收和发送数据
    while (recv(new_socket, buffer, 1024, 0) > 0) {
        printf("Received message: %s\n", buffer);
        if (send(new_socket, greeting, strlen(greeting), 0) == -1) {
            perror("send");
            exit(EXIT_FAILURE);
        }
        bzero(buffer, 1024);
    }
 
    // 关闭套接字
    if (close(server_fd) == -1) {
        perror("close");
        exit(EXIT_FAILURE);
    }
    return 0;
}

客户端代码(client.c):




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int main(int argc, char *argv[]) {
    int sock;
    struct sockaddr_in serv_addr;
    char buffer[1024] = {0};
    if (argc < 2) {
        printf("Please provide the server IP address as first argument\n");
        return 1;
    }
 
    // 创建一个套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
 
    // 设定服务器地址和端口
    serv_addr.sin_family = AF_INET;
    serv_addr.sin
2024-08-13

在Linux文件系统中,每个文件都有一个inode(索引节点),它包含了文件的元数据,比如文件的大小、所有者、创建时间等,但不包含文件名。inode和文件名存储在目录项(directory entry)中,每个目录项包含文件名和对应的inode号。

硬链接(hard link)是一个指向inode的指针,创建硬链接不会创建新的inode。因此,硬链接和原始文件使用相同的inode和存储空间。

软链接(symbolic link或symlink)是一个指向目标文件的指针,它可以指向文件系统中的任何地方,包括不同文件系统或网络文件。创建软链接时,会创建一个新的inode来存储链接的路径。

下面是创建硬链接和软链接的命令示例:




# 创建一个名为file.txt的空文件
touch file.txt
 
# 创建file.txt的硬链接hardlink.txt
ln file.txt hardlink.txt
 
# 创建file.txt的软链接softlink.txt
ln -s file.txt softlink.txt

硬链接和软链接的区别:

  1. 硬链接不能指向目录,而软链接可以。
  2. 删除软链接文件不会影响原始文件,删除硬链接文件只会影响与之关联的inode的引用计数。
  3. 文件的真实内容存储在block中,而inode只记录了文件的元数据和block的位置信息。硬链接和原文件共享同一个inode和blocks,而软链接有自己的inode和blocks,其中blocks存储的是原文件的路径。
2024-08-13

在Windows和Linux中查看进程并杀死进程的方法如下:

Windows:

查看进程:




tasklist

杀死进程:




taskkill /F /IM process_name.exe

Linux:

查看进程:




ps aux

杀死进程:




kill -9 PID

或者




pkill process_name

其中,PID 是进程ID,process_name.exe 是要杀死的进程名称。-9 是信号量,表示强制杀死进程。

请根据实际情况替换 process_name.exePID。使用时请确保你有足够的权限。

2024-08-13

在Linux系统中,软硬链接是文件系统提供的两种不同的链接方式。硬链接不能链接到目录,而软链接可以链接到目录。

创建软硬链接的命令分别为:

创建软链接:ln -s target_path link_path

创建硬链接:ln target_path link_path

其中,target_path 是你要链接的文件或目录的路径,link_path 是链接文件的路径。

动态库(共享库)通常以 .so 结尾,例如 libexample.so。动态库在编译时被引用,运行时由系统动态加载。

静态库通常以 .a 结尾,例如 libexample.a。静态库在编译时被完整复制到可执行文件中,运行时不需要依赖原始的库文件。

创建静态库和动态库的命令分别为:

创建静态库:ar rcs libexample.a file1.o file2.o

创建动态库:gcc -shared -o libexample.so file1.o file2.o

其中,file1.ofile2.o 是要打包的对象文件。

使用库时,需要在编译链接时指定库的路径和名称。例如:

gcc main.c -L./ -lexample -o main

这里 -L 指定了库文件的搜索路径,-l 指定了库的名称(不包含前缀 lib 和后缀 .so.a)。

以上是创建链接、创建库以及链接使用库的基本命令和方法。在实际应用中,还会涉及到更复杂的编译参数和链接参数,如指定库的查找路径、指定导出符号等。

2024-08-13

在Linux中,重定向操作可以通过dup2系统调用来实现,该调用用于复制文件描述符,确保两个文件描述符指向同一个文件表项。

以下是一个简单的C语言示例,演示如何使用dup2来实现标准输入的重定向:




#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main() {
    int old_stdin = dup(STDIN_FILENO); // 保存原始标准输入文件描述符
    int file = open("input.txt", O_RDONLY); // 打开重定向文件
 
    if (file < 0 || old_stdin < 0) {
        perror("Error opening file or duplicating stdin");
        exit(1);
    }
 
    dup2(file, STDIN_FILENO); // 将标准输入重定向到新文件
 
    // 从标准输入读取数据,实际上是从input.txt读取
    char buffer[100];
    fgets(buffer, sizeof(buffer), stdin);
 
    printf("Read from redirected stdin: %s", buffer);
 
    close(file); // 关闭文件描述符
    dup2(old_stdin, STDIN_FILENO); // 恢复标准输入到原来的文件描述符
    close(old_stdin); // 关闭临时保存的文件描述符
 
    return 0;
}

在这个例子中,程序首先保存了原始的标准输入文件描述符,然后打开了一个名为input.txt的文件,并使用dup2将标准输入重定向到这个文件。之后,当程序从stdin读取数据时,实际上是从input.txt中读取。最后,程序将文件描述符和标准输入恢复到它们原来的状态。

2024-08-13

awk是一种处理文本的强大工具,可用于生成报告、修改文本文件等。以下是awk的一些常用用法和示例:

  1. 基本用法:



awk '{print $1}' filename # 打印文件中每行的第一个字段
  1. 修改字段分隔符:



awk -F: '{print $1}' /etc/passwd # 以冒号为分隔符打印/etc/passwd中的用户名
  1. 条件判断:



awk -F: '$3 > 500 {print $1}' /etc/passwd # 打印/etc/passwd中UID大于500的用户名
  1. 循环:



awk -F: '{for (i=1; i<=NF; i++) print $i}' /etc/passwd # 打印/etc/passwd中每个字段
  1. 自定义分隔符:



awk -v FS=':' '{print $1}' /etc/passwd # 以冒号为分隔符打印/etc/passwd中的用户名
  1. 多模式匹配:



awk '/root/,/lp/' /etc/passwd # 打印包含"root"到"lp"之间的行
  1. 数组操作:



awk -F: '{users[$1]+=1} END {for (user in users) print user, users[user]}' /etc/passwd # 统计/etc/passwd中每个用户出现的次数
  1. 函数:



awk 'function absval(x) {return (x < 0) ? -x : x} {print absval($1)}' filename # 打印文件中每行的第一个字段的绝对值

这些是awk的基本用法和示例,实际使用中可以根据需要进行复杂的文本处理。

2024-08-13

在Linux中,find命令是一种强大的文件搜索工具,它允许你根据各种条件来查找文件。以下是一些使用find命令的示例:

  1. 在当前目录及其子目录下查找所有文件名为example.txt的文件:



find . -name example.txt
  1. /home目录下查找所有.jpg结尾的文件:



find /home -name "*.jpg"
  1. /var/log目录下查找修改时间在过去7天内的所有.log文件:



find /var/log -name "*.log" -mtime -7
  1. 查找当前目录及子目录下所有文件大小超过10MB的文件:



find . -type f -size +10M
  1. 查找/etc目录下所有用户ID不为0的文件:



find /etc ! -uid 0
  1. 查找/home目录下所有文件并排除.svn目录:



find /home -path "/home/.svn" -prune -o -print
  1. 查找并删除当前目录下的所有名为example.txt的文件:



find . -name example.txt -exec rm -f {} \;
  1. 查找并删除/tmp目录下所有超过30天的文件:



find /tmp -type f -mtime +30 -exec rm -f {} \;

这些只是find命令的一些基本用法,find命令还有更多复杂的用法和选项,可以通过man find命令查看详细的手册。

2024-08-13

报错问题:"Linux CentOs7系统scl镜像源失效" 指的是在CentOS 7操作系统中,用于管理软件集合的Software Collections (SCL) 仓库的镜像源不可用或者无法连接。

解决方法:

  1. 检查当前网络连接,确保你的服务器可以正常访问互联网。
  2. 更新系统软件包索引:

    
    
    
    sudo yum update
  3. 检查并修复YUM仓库文件:

    
    
    
    sudo yum check-update
  4. 如果是因为原有的镜像源地址失效,你需要找到新的镜像源地址或者更新仓库配置文件。可以查找官方或者第三方的镜像源。
  5. 如果是因为网络问题导致的失效,检查防火墙设置,确保没有阻止相关的网络连接。
  6. 清除YUM缓存:

    
    
    
    sudo yum clean all
  7. 重新加载YUM仓库:

    
    
    
    sudo yum makecache
  8. 如果问题依旧,考虑使用其他方式安装SCL,例如通过编译源码或者使用第三方软件仓库。

如果你已经确认镜像源已经失效且无法找到有效的镜像源,可能需要考虑迁移到其他Linux发行版,或者使用CentOS官方提供的替代软件集合工具,例如devtoolset

2024-08-13

在Linux上手动安装Visual Studio Code Server (vscode-server),你需要执行以下步骤:

  1. 确保你已经安装了Node.js(建议版本8.x或更高)。
  2. 下载vscode-server的tar.gz包。你可以从VS Code的官方发布页面(https://code.visualstudio.com/updates)下载对应版本的tar.gz包,或者直接从微软的Azure CDN下载。
  3. 解压缩下载的tar.gz包。
  4. 在解压目录中运行server.sh脚本来启动服务器。

以下是具体的命令行操作示例:




# 安装Node.js,如果你还没有安装
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
 
# 下载VS Code Server (以版本1.44.2为例)
wget https://update.code.visualstudio.com/commit:9d3539e9e57f6e457fbe97608f85d1a193b994e1/server-linux-x64/stable
tar -xzf stable
 
# 进入解压后的目录
cd vscode-server-linux-x64*/
 
# 启动VS Code Server
./bin/server.sh

请确保将上述命令中的版本号(在wget命令中使用的commit哈希)替换为你需要的最新版本。

启动后,你可以通过Visual Studio Code的客户端连接到这个服务器实例,并开始远程编辑文件。

2024-08-13

要在Linux下分析WebLogic的日志文件,你可以使用命令行工具如grep, awk, sed等来提取、过滤和显示相关信息。以下是一个使用grep的例子,假设你要查找与某个特定错误相关的日志条目。




# 查找日志文件中包含特定错误信息的行
grep '特定错误信息' /u01/weblogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/logs/AdminServer.log
 
# 如果想要查看最近的10条相关日志
grep '特定错误信息' -A 10 /u01/weblogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/logs/AdminServer.log
 
# 使用正则表达式匹配日志时间戳
grep '2023-03-25 [0-9:,.]* 特定错误信息' /u01/weblogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/logs/AdminServer.log

如果你需要更复杂的日志分析,可以考虑使用专门的日志分析工具,如logstash, fluentd, splunk, graylog等。

请根据你的具体需求调整上述命令中的路径和搜索条件。