/********************************************************************************************************* ** 函数名称: API_TShellGetOption ** 功能描述: 获取新的 shell 选项. ** 输 入 : hTShellHandle shell 线程 ** pulOpt shell 选项 ** 输 出 : 错误代码. ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_TShellGetOption (LW_OBJECT_HANDLE hTShellHandle, ULONG *pulOpt) { PLW_CLASS_TCB ptcbShell; UINT16 usIndex; if (!pulOpt) { _ErrorHandle(EINVAL); return (PX_ERROR); } usIndex = _ObjectGetIndex(hTShellHandle); #if LW_CFG_ARG_CHK_EN > 0 if (!_ObjectClassOK(hTShellHandle, _OBJECT_THREAD)) { /* 检查 ID 类型有效性 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (PX_ERROR); } #endif __KERNEL_ENTER(); /* 进入内核 */ if (_Thread_Invalid(usIndex)) { __KERNEL_EXIT(); /* 退出内核 */ _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (PX_ERROR); } ptcbShell = __GET_TCB_FROM_INDEX(usIndex); *pulOpt = __TTINY_SHELL_GET_OPT(ptcbShell); __KERNEL_EXIT(); /* 退出内核 */ return (ERROR_NONE); }
LW_API ULONG API_TShellSigEvent (LW_OBJECT_HANDLE ulShell, struct sigevent *psigevent, INT iSigCode) { REGISTER PLW_CLASS_TCB ptcbShell; REGISTER PLW_CLASS_TCB ptcbJoin; LW_OBJECT_HANDLE ulJoin = LW_OBJECT_HANDLE_INVALID; UINT16 usIndex; usIndex = _ObjectGetIndex(ulShell); __KERNEL_ENTER(); /* 进入内核 */ if (_Thread_Invalid(usIndex)) { __KERNEL_EXIT(); /* 退出内核 */ return (ERROR_THREAD_NULL); } ptcbShell = __GET_TCB_FROM_INDEX(usIndex); ptcbJoin = ptcbShell->TCB_ptcbJoin; if (ptcbJoin) { /* 等待其他线程结束 */ ulJoin = ptcbJoin->TCB_ulId; } __KERNEL_EXIT(); /* 退出内核 */ if (ulJoin) { _doSigEvent(ulJoin, psigevent, iSigCode); } else { _doSigEvent(ulShell, psigevent, iSigCode); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: sigqueue ** 功能描述: 发送队列类型信号, 如果是进程, 将发送给其主线程. ** 输 入 : ulId 线程 id 或者 进程号 ** iSigNo 信号 ** sigvalue 信号 value ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT sigqueue (LW_OBJECT_HANDLE ulId, INT iSigNo, const union sigval sigvalue) { REGISTER UINT16 usIndex; REGISTER PLW_CLASS_TCB ptcb; LW_SEND_VAL sendval; #if LW_CFG_MODULELOADER_EN > 0 if (ulId < LW_CFG_MAX_THREADS) { /* 进程号 */ ulId = vprocMainThread((pid_t)ulId); } #endif /* LW_CFG_MODULELOADER_EN > 0 */ usIndex = _ObjectGetIndex(ulId); if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) { /* 检查 ID 类型有效性 */ _ErrorHandle(ESRCH); return (PX_ERROR); } if (_Thread_Index_Invalid(usIndex)) { /* 检查线程有效性 */ _ErrorHandle(ESRCH); return (PX_ERROR); } if (!__issig(iSigNo)) { _ErrorHandle(EINVAL); return (PX_ERROR); } if (LW_CPU_GET_CUR_NESTING() || (ulId == API_ThreadIdSelf())) { _excJobAdd((VOIDFUNCPTR)sigqueue, (PVOID)ulId, (PVOID)iSigNo, (PVOID)sigvalue.sival_ptr, 0, 0, 0); return (ERROR_NONE); } #if LW_CFG_SMP_EN > 0 if (LW_NCPUS > 1) { /* 正工作在 SMP 多核模式 */ if (API_ThreadStop(ulId)) { return (PX_ERROR); } } #endif /* LW_CFG_SMP_EN */ __KERNEL_ENTER(); /* 进入内核 */ if (_Thread_Invalid(usIndex)) { __KERNEL_EXIT(); /* 退出内核 */ _ErrorHandle(ESRCH); return (PX_ERROR); } ptcb = __GET_TCB_FROM_INDEX(usIndex); if (ptcb->TCB_iDeleteProcStatus) { __KERNEL_EXIT(); /* 退出内核 */ _ErrorHandle(ERROR_THREAD_OTHER_DELETE); return (PX_ERROR); } sendval = _doSigQueue(ptcb, iSigNo, sigvalue); #if LW_CFG_SMP_EN > 0 if (LW_NCPUS > 1) { /* 正工作在 SMP 多核模式 */ _ThreadContinue(ptcb, LW_FALSE); /* 在内核状态下唤醒被停止线程 */ } #endif /* LW_CFG_SMP_EN */ __KERNEL_EXIT(); /* 退出内核 */ #if LW_CFG_SIGNALFD_EN > 0 if (sendval == SEND_BLOCK) { _sigfdReadUnblock(ulId, iSigNo); } #endif /* LW_CFG_SIGNALFD_EN > 0 */ return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_TShellCreateEx ** 功能描述: 创建一个 ttiny shell 系统, SylixOS 支持多个终端设备同时运行. ** tshell 可以使用标准 tty 设备, 或者 pty 虚拟终端设备. ** 输 入 : iTtyFd 终端设备的文件描述符 ** ulOption 启动参数 ** pfuncRunCallback 初始化完毕后, 启动回调 ** 输 出 : shell 线程的句柄. ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API LW_OBJECT_HANDLE API_TShellCreateEx (INT iTtyFd, ULONG ulOption, FUNCPTR pfuncRunCallback) { LW_CLASS_THREADATTR threadattrTShell; LW_OBJECT_HANDLE hTShellHandle; INT iKernelFile; PLW_CLASS_TCB ptcbShell; _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system initialize...\r\n"); if (!isatty(iTtyFd)) { /* 检测是否为终端设备 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "is not a tty or pty device.\r\n"); _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system is not initialize.\r\n"); return (0); } API_TShellInit(); /* 初始化 shell */ if (__PROC_GET_PID_CUR() != 0) { /* 在进程中启动 */ iKernelFile = dup2kernel(iTtyFd); /* 将此文件描述符 dup 到 kernel*/ if (iKernelFile < 0) { return (0); } ulOption |= LW_OPTION_TSHELL_CLOSE_FD; /* 执行完毕后需要关闭文件 */ pfuncRunCallback = LW_NULL; /* 进程创建不得安装回调 */ } else { iKernelFile = iTtyFd; } API_ThreadAttrBuild(&threadattrTShell, _G_stShellStackSize, /* shell 堆栈大小 */ LW_PRIO_T_SHELL, LW_CFG_SHELL_THREAD_OPTION | LW_OPTION_OBJECT_GLOBAL, (PVOID)iKernelFile); /* 构建属性块 */ hTShellHandle = API_ThreadInit("t_tshell", __tshellThread, &threadattrTShell, LW_NULL); /* 创建 tshell 线程 */ if (!hTShellHandle) { if (__PROC_GET_PID_CUR() != 0) { /* 在进程中启动 */ __KERNEL_SPACE_ENTER(); close(iKernelFile); /* 内核中关闭 dup 到内核的文件 */ __KERNEL_SPACE_EXIT(); } _DebugHandle(__ERRORMESSAGE_LEVEL, "tshell thread can not create.\r\n"); _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system is not initialize.\r\n"); return (0); } ptcbShell = __GET_TCB_FROM_INDEX(_ObjectGetIndex(hTShellHandle)); __TTINY_SHELL_SET_OPT(ptcbShell, ulOption); /* 初始化选项 */ __TTINY_SHELL_SET_CALLBACK(ptcbShell, pfuncRunCallback); /* 初始化启动回调 */ API_ThreadStart(hTShellHandle); /* 启动 shell 线程 */ return (hTShellHandle); }