嵌入式linux通过systemd自启动一个c代码

2023-11-12

上一篇博文说了嵌入式linux通过systemd自启动一个python代码,这次把python代码改为c代码,再试试。

主要有两个文件:

/etc/systemd/system/autostart.service,用于启动/home/roor/autostart.sh

/home/roor/autostart.sh用于启动c代码编译而成的二进制可执行代码xwsoft。

其中,/etc/systemd/system/autostart.service代码如下:

[Unit]
Description=python_detection
DefaultDependencies=no
Documentation=
After=network.target multi-user.target timers.target
Wants=
Requires=

[Service]
Type=forking
ExecStart=/home/root/autostart.sh
Restart=on-failure
ExecStop=
ExecReload=/home/root/autostart.sh

[Install]
WantedBy=multi-user.target

/home/roor/autostart.sh代码如下:

#!/bin/sh

sleep 10
sudo ifconfig eth0 up 192.168.137.81
sleep 5
sudo ip link set can0 up type can bitrate 500000
sleep 5
sudo ip link set can1 up type can bitrate 500000

sleep 5
cd /home/root
sudo ./xwsoft &
#cd /home/root/python
#sudo /usr/bin/python3 mydeamon.py & 

而最终要实现的xwsoft代码如下:

#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <net/if.h>

#define MAX_BUF 256
#define RECV_TIME_OUT 1

// int init_daemon(void)
// {
//     int pid;
//     int i;

//     // 1)屏蔽一些控制终端操作的信号
//     signal(SIGTTOU, SIG_IGN);
//     signal(SIGTTIN, SIG_IGN);
//     signal(SIGTSTP, SIG_IGN);
//     signal(SIGHUP, SIG_IGN);

//     // 2)在后台运行
//     if (pid = fork())
//     {            // 父进程
//         exit(0); //结束父进程,子进程继续
//     }
//     else if (pid < 0)
//     { // 出错
//         perror("fork");
//         exit(EXIT_FAILURE);
//     }

//     // 3)脱离控制终端、登录会话和进程组
//     setsid();

//     // 4)禁止进程重新打开控制终端
//     if (pid = fork())
//     {            // 父进程
//         exit(0); // 结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
//     }
//     else if (pid < 0)
//     { // 出错
//         perror("fork");
//         exit(EXIT_FAILURE);
//     }

//     // 5)关闭打开的文件描述符
//     // NOFILE 为 <sys/param.h> 的宏定义
//     // NOFILE 为文件描述符最大个数,不同系统有不同限制
//     for (i = 0; i < NOFILE; ++i)
//     {
//         close(i);
//     }

//     // 6)改变当前工作目录
//     chdir("/tmp");

//     // 7)重设文件创建掩模
//     umask(0);

//     // 8)处理 SIGCHLD 信号
//     signal(SIGCHLD, SIG_IGN);

//     return 0;
// }

int main(int argc, char *argv[])
{
    struct ifreq ifr = {0};
    struct sockaddr_can can_addr = {0};
    struct can_frame frame = {0};
    int sockfd = -1;
    int i;
    int ret;

    //printf("start xwsoft daemon.\n");

    /* create daemon */
    //init_daemon();


    /* 打开套接字 */
    sockfd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    if (0 > sockfd)
    {
        //perror("socket error");
        exit(EXIT_FAILURE);
    }
    /* 指定 can0 设备 */
    strcpy(ifr.ifr_name, "can0");
    ioctl(sockfd, SIOCGIFINDEX, &ifr);
    can_addr.can_family = AF_CAN;
    can_addr.can_ifindex = ifr.ifr_ifindex;
    /* 将 can0 与套接字进行绑定 */
    ret = bind(sockfd, (struct sockaddr *)&can_addr, sizeof(can_addr));
    if (0 > ret)
    {
        //perror("bind error");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    while (1)
    {
        /* receive msg */
        if (0 > read(sockfd, &frame, sizeof(struct can_frame)))
        {
            //perror("read error");
            break;
        }

        /* send msg */
        ret = write(sockfd, &frame, sizeof(frame)); //发送数据
        if (sizeof(frame) != ret)
        { //如果 ret 不等于帧长度,就说明发送失败
            //perror("write error");
            break;
        }
    }
    /* 关闭套接字 */
    close(sockfd);
    exit(EXIT_SUCCESS);

    return 0;
}

如上图所示,本来想创建一个daemon进程,结果试了半天都不行,不知道哪里出错了,只好暂时放弃daemon。

最终程序运行后,可在ps -x进程列表中看到xwsoft进程在启动运行。

  134 ?        S<     0:00 [ext4-rsv-conver]                                    
  154 ?        Ss     0:00 /lib/systemd/systemd-journald                        
  164 ?        Ss     0:01 /lib/systemd/systemd-udevd                           
  215 ?        Ss     0:00 /usr/sbin/crond -n                                   
  220 ?        Ss     0:00 /lib/systemd/systemd-logind                          
  224 ?        Ss     0:00 /sbin/syslogd                                        
  283 ?        Ss     0:00 /usr/sbin/connmand -n                                
  288 ?        Ss     0:00 /usr/sbin/ofonod -n                                  
  304 ?        Ss     0:00 /usr/sbin/atd -f                                     
  441 ?        Ss     0:00 /usr/sbin/wpa_supplicant -u                          
  445 ?        Ss     0:00 /sbin/klogd                                          
  453 tty1     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux        
  457 ttymxc0  Ss     0:00 /bin/login -f                                        
  459 ?        S      0:00 [kworker/0:5]                                        
  505 ?        Ss     0:00 /lib/systemd/systemd --user                          
  512 ?        S      0:00 (sd-pam)                                             
  524 ttymxc0  S      0:00 -sh                                                  
  539 ?        S      0:00 sudo ./xwsoft                                        
  540 ?        S      0:00 ./xwsoft                                             
  542 ttymxc0  R+     0:00 ps -x             

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式linux通过systemd自启动一个c代码 的相关文章

  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • pip:需要将包名称tensorflow-gpu更改为tensorflow

    我正在尝试将具有 GPU 支持的张量流安装到 conda 环境中 我使用命令 pip install ignore installed upgrade https storage googleapis com tensorflow linu
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在 Ubuntu 中使用 Gstreamer 通过 RTP 协议流式传输 Mp4 视频

    我正在尝试从本地目录获取视频文件 启用来自服务器的流并从客户端捕获这些帧 我使用了以下管道 服务器端 gst launch v filesrc location home gokul Videos Econ TestVideo radioa
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包

随机推荐

  • Probabilistic Anchor Assignment with IoU Prediction for Object Detection论文阅读翻译 - 2020ECCV

    Probabilistic Anchor Assignment with IoU Prediction for Object Detection论文阅读翻译 目录 Probabilistic Anchor Assignment with I
  • 西门子plc s7-200写的先进先出范例 用fifo

    本人最近写了一个五台锅炉共用一个冷却水泵的程序 开始打算用时间戳来记录每台锅炉需要冷却的时间 然后用时间进行排序 但是后来无意中发现fifo可以实现表的先进先出的功能 就抱着学习的目的 用fifo写了本程序 第一步 先要建立一个表如下图 上
  • 分布式三高商城系统前言

    商城系统前言 前言 本商城致力于为中大型企业打造一个功能完整 易于维护的微服务B2B2C电商商城系统 采用主流的微服务技术实现 完全从零开始带领大家完成一个商城系统 包括基础的项目环境搭建 后端业务代码编写 前端页面等 微服务设计 mall
  • 多租户SaaS管理系统框架设计:多租户,多组织,用户区别

    数商云 已认证的官方帐号 转载自 多租户SaaS管理系统框架设计 多租户 多组织 用户区别 知乎 今天谈下云平台下的多租户架构 不论是在公有云还是私有云平台 是设计一个面向最终组织或用户的SaaS应用还是面向业务系统的PaaS平台 多租户都
  • 【物流配送的车辆路径问题】

    物流配送的车辆路径问题 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 Two echelon capacitated vehicle routing problem with grouping constraints a
  • Human Gene Functions

    http acm hdu edu cn showproblem php pid 1080 Problem Description It is well known that a human gene can be considered as
  • leetcode刷题(10.22总结)

    1 丢失的数字 题目描述 https leetcode cn problems missing number class Solution def missingNumber self nums List int gt int n len
  • 基于SSM+MySQL在线书城项目

    目录 1 项目简介 2 项目说明 3 项目功能 4 项目展示 5 项目获取 1 项目简介 随着互联网发展 网上商城越来越活跃 线下购物方式逐渐弱化 在线购物越来越获得公众的欢迎 在线书城项目是一款B2C的线上购书系统 用户可以在本网站上购买
  • IDEA导入Web项目的三种方式

    文章目录 前言 一 第一种方式 二 第二种方式 三 第三种方式 前言 无论那种方式 它们都有相同的前提 那就是首先将你想要导入的Web项目放置在你想要导入的工程目录下 例如 举例子 笔者要将一个名为mavenWeb1的Web项目 笔者自己的
  • idm 服务器响应显示您没有权限下载此文件_玩转IDM,你不知道的IDM巧妙使用方法...

    在此前分享过的一系列百度网盘加速下载文章中 IDM Internet Download Manager 是不可或缺的一个环节 IDM 除了可以用来加速下载百度网盘资源外 其本身也是一款非常强大的下载器 它高速 精简 高效 把 一个程序做好一
  • 远程桌面控制台,有标签页可以管理多个远程桌面

    Server 2003系统自带远程桌面控制台 有标签页可以管理多个远程桌面 在windows的其他系统如果要实现可以参照以下操作 1 将server2003系统C WINDOWS system32目录下的mstsmhst dll mstsm
  • Android之 WebView的使用

    一 简介 1 1 WebView是用来展示网页的控件 底层是google的WebKit的引擎 比起苹果的WebView webkit一些不足地方 不能支持word等文件的预览 纯标签加载 并不支持所有标签的加载 不支持文件的下载 图片的放大
  • Elasticsearch 索引增删改

    添加小编微信 372787553 进入程序员技术交流群 本文已被 ElasticSearch从入门到入魔 收录 Elasticsearch 增删改 在前面我们已经安装好了elasticsearch 已经kibana 如果您还没有安装可以参考
  • 区块链倪老师:《区块链思维》第二章——“二维思维”的使用方法

    上回在 区块链思维 第一章中 我们已经从 一维思维 进阶到了 二维思维 今天我们就来讲讲如何使用 二维思维 二维思维 也叫结构化思维 顾名思义是将知识进行结构化的一种思维方式 同样 在区块链系统中 不同的部分分别构成了不同的结构 一般说来
  • 我的Android进阶之旅------>经典的大客推荐(排名不分先后)!!

    今天看到一篇文章 收藏了很多大牛的博客 在这里分享一下 转载于 http blog csdn net wujxiaoz article details 8237096 Android中文Wiki AndroidStudio NDK开发 移动
  • 思维导图系列——数据库

    思维导图系列 数据库 思维导图为博主期末复习亲自整理而成的 知识点覆盖全 可直接看思维导图复习 包含注解 图示等 觉得对你有帮助 不妨一键三连哦 链接见文末 参考书目 数据库系统概论 第5版 王珊 系列文章直达 思维导图系列 操作系统 思维
  • Qt信号与槽机制的本质

    引入 对象与对象之间的通信有多个方式 如果我们要提供一种对象之间的通信机制 这种机制 要能够给两个不同对象中的函数建立映射关系 前者被调用时后者也能被自动调用 再深入一些 两个对象如果都互相不知道对方的存在 仍然可以建立联系 甚至一对一的映
  • 人物故事

    李飞飞 导语 今年9月11日 谷歌云AI部门负责人李飞飞宣布即将离职 回到斯坦福大学任教 外媒 连线 杂志日前刊文 讲述了李飞飞离职背后的故事 以下为文章全文 去年六月有段时间 凌晨一点左右 李飞飞穿着睡衣 坐在华盛顿特区酒店房间里 练习几
  • web页面攻击分为几类?可以提供几种解决方案吗?

    WEB基本攻击大致可以分为三大类 资源枚举 参数操纵 和 其它攻击 资源枚举 遍历站点所有可访问的目录 然后把一些常见的备胎文件名 比如 sql bak index 副本 html 一个个都枚举一下 如果运气好枚举到了就直接下载 参数操纵
  • 嵌入式linux通过systemd自启动一个c代码

    上一篇博文说了嵌入式linux通过systemd自启动一个python代码 这次把python代码改为c代码 再试试 主要有两个文件 etc systemd system autostart service 用于启动 home roor a