Linux C编程(二)

在linux下使用c语言实现MQTT通信(二.编程实现) 我是用的secureCRT登录的树莓派,要实现MQTT通信,就需要用到许多关于MQTT的函数,这里我用的是Paho.c库,所以首先下载库: 在git下下载paho C库git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c make//编译 sudo make install//安装 执行make之后我们在build... 阅读详情

1、父进程创建一个新的文本文件,并向文本文件中写入数据,当数据写入完成后,用匿名管道通信的方式将该文件传输给子进程,同时用命名管道文件将该文件传输给另一个进程

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#define BUFSZ 256
#define FIFO_NAME "/home/xianfeng/my_fifo"
#define BUFFER_SIZE PIPE_BUF

int main(void)
{
        FILE *fp;
        char *hello="hello ";
        int res;
        int fd[2];
        char buf[BUFSZ];
        pid_t pid;
        int len;
        if( pipe(fd)<0 )
        {
                perror("管道调用失败");
                exit(1);
        }
        if( (pid = fork())<0 )
        {
                perror("创建进程失败");
                exit(1);
        }
    else if(pid > 0)
        {
                printf("这是父进程\n");
                //fd[1]=open("test,txt");
                printf("父进程写入hello");
                write(fd[1], "hello\n", 25);

        printf("\n");
		if(access(FIFO_NAME,F_OK)==-1){
            res=mkfifo(FIFO_NAME,0777);
            if(res!=0){
                fprintf(stderr,"创建fifo文件失败\n");
                exit(EXIT_FAILURE);
            }
		}
		printf("Process %d opening FIFO\n", getpid());
        res = open(FIFO_NAME, O_WRONLY);
        printf("Process %d result %d\n", getpid(), res);
        sleep(5);
        if (res != -1){
            write(res,"Hello Linux!\n",25);
        }
         (void)close(res);
        printf("Process %d finished\n", getpid());
        exit(EXIT_SUCCESS);
        }
        else
        {
                printf("这是子进程\n");
                read(fd[0], buf, BUFSZ);
                printf("子进程读出结果 %s\n", buf);
        }
                return 0;
}
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>

#define FIFO_NAME "/home/xianfeng/my_fifo"
#define BUFFER_SIZE PIPE_BUF
#define TEN_MEG (1024 * 1024 * 10)

int main()
{
    int pipe_fd;
    int res;
    int open_mode = O_RDONLY;
    int bytes_sent = 0;
    char buffer[BUFFER_SIZE + 1];

    printf("Process %d opening FIFO O_RDONLY\n", getpid());
    pipe_fd = open(FIFO_NAME, open_mode);
    read(pipe_fd,buffer,25);
    printf("%s\n",buffer);	

    printf("Process %d finished\n", getpid());
    exit(EXIT_SUCCESS);
}

2、利用套接字分别编写一个简易的服务器端程序和客户端程序,实现基于INTERNET的双向网络通信

/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    int sockfd;
    int len;
    struct sockaddr_in address;
    int result;
    char ch = 'A';

    sockfd = socket(AF_INET, SOCK_STREAM, 0);    //创建套接字
    //套接字命名
    address.sin_family = AF_INET;                       
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = 9734;
    len = sizeof(address);	
    //连接到服务器套接字
    result = connect(sockfd, (struct sockaddr *)&address, len);

    if(result == -1) {
        perror("oops: client");
        exit(1);
    }
    //通信操作
    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    printf("char from server = %c\n", ch);
    close(sockfd);   
    exit(0);
}
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    //创建套接字
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    //命名套接字
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_address.sin_port = 9734;
    server_len = sizeof(server_address);
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);  //bind命名

    //创建一个连接队列
    listen(server_sockfd, 5);    //创建容量为5的队列
    while(1) {
        char ch;
        printf("server waiting\n");

    //接受一个连接
        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);  //accept接受客户连接
    //通信操作
        read(client_sockfd, &ch, 1);
        ch++;
        write(client_sockfd, &ch, 1);
        close(client_sockfd);
    }
}

3、假设有一个整数初值为200,开20个线程,每个线程将这个整数减掉10,最后刚好把这个整数减到0,;要求考虑同步与互斥管理,实现死锁的检测和避免管理

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 20

void *thread_function(void *arg);
sem_t bin_sem;

#define WORK_SIZE 1024
char work_area[WORK_SIZE];

int num=200;
int main() {
    int res;
    pthread_t a_thread[NUM_THREADS];
    void *thread_result;
    int lots_of_threads;
    res = sem_init(&bin_sem, 0, 0);
    if (res != 0) {
        perror("信号初始化错误\n");
        exit(EXIT_FAILURE);
    }

    for(lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) {

        res = pthread_create(&(a_thread[lots_of_threads]), NULL, thread_function, (void *)&lots_of_threads);//创建进程,用数组表示
        if (res != 0) {
            perror("线程创建失败\n");
            exit(EXIT_FAILURE);
        }
        sleep(1);
    }
    for(lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0; lots_of_threads--) {
        res = pthread_join(a_thread[lots_of_threads], &thread_result/*指向线程返回值*/);  //以阻塞的方式等待线程结束,进程同步操作
        if (res == 0) {
            printf("Picked up a thread\n");
        }
        else {
            perror("pthread_join failed");
        }
    }
    printf("All done\n");
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg) {
    sem_post(&bin_sem);
    int my_number = *(int *)arg;
    int rand_num;
    num-=10;
    printf("%d\n",num);
    printf("thread_function is running. Argument was %d\n", my_number);
    rand_num=1+(int)(9.0*rand()/(RAND_MAX+1.0));
    sleep(rand_num);
    printf("Bye from %d\n", my_number);
    sem_post(&bin_sem);
    pthread_exit(NULL);
}
足球大数据分析入门:从赔率到预测的完整流程(附数据集) 本文提供了一份足球大数据分析的完整实战指南,涵盖从数据采集、清洗、特征工程到模型构建与评估的全流程。文章详细介绍了如何利用公开数据集与API获取数据,并通过逻辑回归、随机森林等模型进行比赛结果预测,最后强调了模型评估与策略回测的重要性,帮助读者构建自己的分析框架。 阅读详情

相关推荐

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

Linux c/c++进程间通信(1)

1. 进程间通信的概念 进程间通信是指不同的进程之间进行信息的传递 1. 同一主机上的进程通信 父子进程之间 非父子进程之间 2.不同主机上的进程通信(网络通信) 2. 普通文件通信 父子进程之间可以直接通过文件描述符号(fd)直接进行通信 示例: 父进程写文件,子进程读取文件 #include <stdio.h> #include <s...

ShiXiAoLaNga的博客 1723

使用 Wireshark 分析 PPPoE 流量中的 BRAS 名称 AC-Name

客户端发出广播请求,寻找 PPPoE 服务器。: BRAS 服务器响应 PADI 请求,提供服务并包含AC-Name。: 客户端选择一个 BRAS 并发起连接请求。: BRAS 确认连接并分配会话 ID。在这些阶段中,AC-Name是 BRAS 提供的一个关键字段,用于标识服务器名称。

caca_66的博客 2068

Linux系统下C语言的编程技巧

Linux系统能够为人们提供更加安全实用的效果,保证计算机系统能够稳定的运行。利用Linux系统下首先要进行C语言的编程,掌握编程的技巧能够更好的发挥计算机的作用。如何掌握Linux系统下计算机C语言的编程技巧是计算机发展的关键要素。本文对Linux系统下计算机C语言的编程技巧进行相应的分析。

weixin_44617651的博客 2900

【AUTOSAR-COM】Transmission Mode 和 Transfer Property

1.COM模块的基本概念 首先在描述Transmission Mode 和 Transfer Property之前,有必要对COM模块的基本处理有一个直观的理解,我所描述的和对概念理解的也不一定完全正确。 Signal:指的是通信协议中的,一条报文中所保存的若干信号。 I-PDU:至少在COM模块中,可以理解为一条报文。 上图是在CANdb软件中编辑一个报文的Layout的界面,可以很形象的将I-PDU对等为这里的一条Message,而Signal就是需要在Message中需要摆放的Signal

tim_hoven的博客 4635

端侧视觉赋能手游自动化:YOLOv8+NCNN实现低风险挂机与广告拦截

本文提出一种基于端侧AI的移动游戏自动化解决方案,采用YOLOv8目标检测和NCNN推理框架,结合AutoJS实现"感知-决策-执行"闭环。方案通过轻量化模型训练、多分辨率适配和行为拟态优化,解决了传统脚本的适配性和风控问题。关键技术包括:构建游戏专属数据集、模型量化优化、广告拦截和挂机功能实现,具有本地运行、安全稳定等特点,为个人开发者提供了一套完整的自动化开发框架。

milk416666的博客 1266

Linux (Ubuntu)c编程 (入门必看)

make:一般说GNU Make 是一个软件,用于将源代码文件编译为可执行的二进制文件,make主要用于完成自动化编译,make 工具编译的时候需要 make file 文件提供编译文件。Make file :make工具所使用的文件,Make file 指明了编译规则。

weixin_68773927的博客 2423

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 282

Linux下的C语言编程(基础知识)

Linux下的C语言编程

weixin_65384924的博客 4137

【YOLO目标检测全栈实战】68 模型量化:从FP32到INT8,精度不掉,速度翻倍

摘要: 模型量化能显著提升推理速度(如YOLOv5s帧率从15FPS提升至38FPS),但需避免三大误区:1)校准集需覆盖实际场景,而非随机采样;2)敏感层(如检测头)应保留FP32精度;3)预处理必须与量化前后一致。通过混合精度量化(Backbone用INT8,检测头用FP32)和逐通道量化,可实现<1%的mAP损失。关键步骤包括校准数据准备、量化感知训练及逐层精度评估,最终在Jetson Nano等边缘设备上实现速度与精度的平衡。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 146

36、R语言中的回归模型与机器学习算法

本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能

yhn456789的博客 122

Linux系统编写C语言程序并执行(图文详解)

LINUX中包含了很多软件开发工具。它们中的很多是用于C和C++应用程序开发的。C是一种能在UNIX的早期就被广泛使用的通用编程语言。它最早是由Bell实验室的Dennis Ritchie为了UNIX的辅助开发而写的,从此C就成为世界上使用最广泛的计算机语言。C能在编程领域里得到如此广泛支持的原因有:(1)它是一种非常通用的语言,并且它的语法和函数库在不同的平台上都是统一的,对开发者非常有吸引力;(2)用C写的程序执行速度很快;(3)C是所有版本UNIX上的系统语言;

m0_73633088的博客 2万+

【Matlab】多旋翼无人机视觉伺服跟踪控制程序

本文介绍了基于Matlab的多旋翼无人机视觉伺服跟踪控制程序开发方法。该系统采用视觉感知、坐标转换、伺服控制和仿真验证四个核心模块,通过HOG+SVM目标检测、Shi-Tomasi特征提取和PID双闭环控制算法实现动态目标跟踪。详细阐述了相机标定、目标检测、坐标转换及伺服控制等关键环节的Matlab实现代码,并进行了仿真验证。结果表明该系统在±0.1m的跟踪精度下可实现100Hz的实时处理,适用于室内外复杂场景。文章还提出了工程应用中的优化建议,为无人机视觉伺服系统的开发提供了完整的技术方案。

unber的博客 507

Linux下的C编程实战(二)----文件系统编程

Linux文件系统 Linux支持多种文件系统,如ext、ext2、minix、iso9660、msdos、fat、vfat、nfs等。在这些具体文件系统的上层,Linux提供了虚拟文件系统(VFS)来统一它们的行为,虚拟文件系统为不同的文件系统与内核的通信提供了一致的接口。 在Linux平台下对文件编程可以使用两类函数:(1)Linux操作系统文件API;(2)C语言I/O库函数。前者依赖于

白永辉的专栏 713

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LINUX下的C编程入门(二)文件系统编程

1.Linux文件系统  Linux支持多种文件系统,如ext、ext2、minix、iso9660、msdos、fat、vfat、nfs等。在这些具体文件系统的上层,Linux提供了虚拟文件系统(VFS)来统一它们的行为,虚拟文件系统为不同的文件系统与内核的通信提供了一致的接口。下图给出了Linux中文件系统的关系:    在Linux平台下对文件编程可以使用两类函数:(1)Linux操作

LIBIN690145955的专栏 520

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux下的C编程实战(二)――文件系统编程

Linux下的C编程实战(二) ――文件系统编程 宋宝华[email]21cnbao@21cn.com[/email] 1.Linux文件系统 Linux支持多种文件系统,如ext、ext2、minix、iso9660、msdos、fat、vfat、nfs等。在这些具体文件系统的上层,Linux提供了虚拟文件系统(VFS)来统一...

weixin_34381666的博客 134

linux c 编程模板总结(二)

01)linux下的c语言开发(网络编程) 02)linux下的c语言开发(线程互斥) 03)linux下的c语言开发(线程等待) 04)linux下的c语言开发(多线程编程) 05)linux下的c语言开发(管道通信) 06)linux下的c语言开发(信号处理) 07)linux下的c语言开发(进程等待) 08)linux下的c语言开发(进程创建) 09)

benpaobagzb的博客 829

实验二 Linux下C语言编程基础

1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 一:Vim 1.使用vim命令进入vim界面 $ vim practice_1.txt 或 $ vim 2...

aomaiyan2259的博客 1264

Linux C编程:实验二文件IO编程

本文介绍了Linux文件I/O操作实验,主要内容包括:1.通过编写文件读写和上锁程序,掌握open()、read()、write()等函数使用;2.选做多路复用串口操作,使用select()实现虚拟串口与键盘输入监听;3.实验过程中解决了文件读写乱码、锁失效等问题;4.总结了虚拟文件系统的作用(提供统一接口)及底层/标准文件操作区别(系统调用vs库函数、有无缓冲等)。实验验证了文件锁互斥机制,加深了对I/O核心知识点的理解。(149字)

这个人很懒,什么也没有留下。 864

Linux环境下的C语言编程(二)

本文是学习嵌入式C语言的笔记总结,重点从HelloWorld程序出发探讨C语言编程规范与核心概念。主要内容包括:1)头文件正确包含的方法与重要性;2)函数模块化编程的优势;3)代码组织结构的声明与实现分离;4)return与exit的区别;5)代码格式规范与注释要点;6)算法与程序的关系,以及进程概念;7)内存管理原则如防止越界和内存泄漏。文章通过具体代码示例,强调编程思路、代码规范和最佳实践对软件开发的重要性。

fufu0311的博客 764

Linux下的C编程(二)Linux 基本使用

简介 Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。 Linux诞生于1991年、发展至今已然成为当今主流、且先进并富有生命力的一款操作系统。被广泛使用在服务器、嵌入式系统和个人计算机等多个方面。 先拜见下祖师爷: 祖师爷牛*! 提起Linux,就不得不说Unix,Unix诞生与1969年的bell实验室,它是Ken.Thompson和Dennis Ritche在DEC PDP-7小型计算机

ULis的博客 886

Linux下C/C++编程(二):了解Linux

1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟练使用gcc编译器的常用选项 4 .熟练使用gdb调试技术 5. 熟悉makefile基本原理及语法规范 6. 掌握静态库和动态库的生成

baidu_34933057的博客 335

linux C socket 编程(二)

《linux C socket 编程(一)》接着上一篇的socket网络编程的函数介绍,接下来做一个socket网络编程实例:

逝水流年 702

linux环境下C编程(二)

c语言中的提供了一组标准函数来解决常见的问题 每个标准函数都有自己的名字 printf标准函数把数据打印在屏幕上 为了使用这个标准函数需要包含stdio.h文件 使用标准函数需要写出函数名 \n表示换行 可以采用占位符打印编写程序时还不知道的数字 字符。 %d占位符和整型数字匹配 占位符的个数必须和数字的个数一样 程序中所有相关数据都放置在内存里 变量对应了内存中的某个

陈同心 1333

Linux-C编程总结(二)

梳理内容 指针(指针作用、指针运算、多维指针的作用、野指针、void*) 数组(数组名的作用(123)、数组指针、指针数组、传参) 字符串(字符串操作函数:实现这些函数) 函数(代码规范、函数传参(传值VS传递至)、传出参数、传入参数、return 0、函数指针、函数指针数组 ) 复杂函数声明(右左法则) 一、指针 指针是什么?变量、固定长度、占用内存空间(4/8) char *ptr = “hello world”——(字符串就是地址,字符串的首地址)hello world存在文字常量区,不可修改。

weixin_45998055的博客 179
上一篇: Linux C编程练习(一)
下一篇: H5通过百度地图API获取当前地理位置
玄蛰
博客等级 码龄9年 89粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值