You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Iot_Cs_best/init.c

102 lines
4.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#ifdef LOSCFG_QUICK_START
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#define QUICKSTART_IOC_MAGIC 'T'
#define QUICKSTART_INITSTEP2 _IO(QUICKSTART_IOC_MAGIC, 0)
#define WAIT_FOR_SAMPLE 300000 // wait 300ms for sample
#endif
int main(int argc, char * const *argv)
{
(void)argv;
int ret; // 声明一个整数变量ret用于存储函数的返回值
pid_t gid; // 声明一个pid_t类型的变量gid用于存储进程组ID
const char *shellPath = "/bin/mksh";// 定义一个字符串常量shellPath存储shell的路径这里使用的是mksh shell
// 以下部分是一个条件编译块如果定义了LOSCFG_QUICK_START宏这段代码会被编译进程序
#ifdef LOSCFG_QUICK_START
const char *samplePath = "/dev/shm/sample_quickstart";// 定义一个字符串常量samplePath存储sample_quickstart的路径
// 使用fork函数创建子进程返回值存储在ret变量中
// 如果ret小于0说明创建子进程失败如果ret等于0说明这是子进程如果ret大于0说明这是父进程ret是子进程的ID
ret = fork();
if (ret < 0) { // 如果创建子进程失败,输出错误消息
printf("Failed to fork for sample_quickstart\n");
} else if (ret == 0) {// 如果是子进程获取进程组ID并存储在gid变量中如果获取失败输出错误消息并退出
(void)execve(samplePath, NULL, NULL);
exit(0);
}
usleep(WAIT_FOR_SAMPLE);
int fd = open("/dev/quickstart", O_RDONLY);
if (fd != -1) {
ioctl(fd, QUICKSTART_INITSTEP2);
close(fd);
}
#endif
ret = fork();
if (ret < 0) {
printf("Failed to fork for shell\n");
} else if (ret == 0) {
gid = getpgrp();
if (gid < 0) {
printf("get group id failed, pgrpid %d, errno %d\n", gid, errno);
exit(0);
}
ret = tcsetpgrp(STDIN_FILENO, gid);
if (ret != 0) {// 如果是子进程尝试将STDIN标准输入重定向到指定的进程组通过tcsetpgrp函数实现如果重定向失败输出错误消息并退出
printf("tcsetpgrp failed, errno %d\n", errno);
exit(0);
}
// 如果是子进程使用execve函数执行shellPath指定的shell程序参数为NULL环境变量为NULL
(void)execve(shellPath, NULL, NULL);
exit(0);
}
while (1) { // 如果是父进程进入一个无限循环不断地调用waitpid函数等待子进程的状态变化通过WNOHANG标志实现
ret = waitpid(-1, 0, WNOHANG); // 如果子进程还在运行等待1秒后再次检查如果子进程已经停止运行继续等待下一次检查通过waitpid函数实现
if (ret == 0) {
sleep(1);
}
};
}