!693 fix: 修复Ctrl+C会终止所有进程的问题
Merge pull request !693 from huangshan/fix-pgrp
This commit is contained in:
commit
5077b1793f
|
@ -43,8 +43,10 @@ extern "C" {
|
||||||
#define SHELL_ENTRY_STACKSIZE 0x1000
|
#define SHELL_ENTRY_STACKSIZE 0x1000
|
||||||
#define SHELL_TASK_STACKSIZE 0x3000
|
#define SHELL_TASK_STACKSIZE 0x3000
|
||||||
|
|
||||||
#define SHELL_EXEC_COMMAND "exec "
|
#define SHELL_EXEC_COMMAND "exec"
|
||||||
#define SHELL_EXEC_COMMAND_BYTES 5
|
#define SHELL_EXEC_COMMAND_BYTES 4
|
||||||
|
#define CMD_EXEC_COMMAND SHELL_EXEC_COMMAND" "
|
||||||
|
#define CMD_EXEC_COMMAND_BYTES (SHELL_EXEC_COMMAND_BYTES+1)
|
||||||
|
|
||||||
#define CONSOLE_IOC_MAGIC 'c'
|
#define CONSOLE_IOC_MAGIC 'c'
|
||||||
#define CONSOLE_CONTROL_REG_USERTASK _IO(CONSOLE_IOC_MAGIC, 7)
|
#define CONSOLE_CONTROL_REG_USERTASK _IO(CONSOLE_IOC_MAGIC, 7)
|
||||||
|
@ -57,6 +59,7 @@ extern "C" {
|
||||||
typedef void (*OutputFunc)(const char *fmt, ...);
|
typedef void (*OutputFunc)(const char *fmt, ...);
|
||||||
extern int ShellTaskInit(ShellCB *shellCB);
|
extern int ShellTaskInit(ShellCB *shellCB);
|
||||||
extern int ShellEntryInit(ShellCB *shellCB);
|
extern int ShellEntryInit(ShellCB *shellCB);
|
||||||
|
extern void ChildExec(const char *cmdName, char *const paramArray[]);
|
||||||
extern void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB);
|
extern void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB);
|
||||||
extern int ShellNotify(ShellCB *shellCB);
|
extern int ShellNotify(ShellCB *shellCB);
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,9 @@ static int DoShellExec(char **argv)
|
||||||
int ret = SH_NOK;
|
int ret = SH_NOK;
|
||||||
char *cmdLine = NULL;
|
char *cmdLine = NULL;
|
||||||
|
|
||||||
|
if (strncmp(argv[0], SHELL_EXEC_COMMAND, SHELL_EXEC_COMMAND_BYTES) == 0) {
|
||||||
|
ChildExec(argv[1], argv + 1);
|
||||||
|
}
|
||||||
for (i = 0; argv[i]; i++) {
|
for (i = 0; argv[i]; i++) {
|
||||||
len += strlen(argv[i]);
|
len += strlen(argv[i]);
|
||||||
}
|
}
|
||||||
|
@ -123,7 +126,7 @@ int main(int argc, char **argv)
|
||||||
int ret = SH_NOK;
|
int ret = SH_NOK;
|
||||||
ShellCB *shellCB = NULL;
|
ShellCB *shellCB = NULL;
|
||||||
|
|
||||||
if (!strcmp(argv[0], "shell") && argv[1]) {
|
if (argc > 1) {
|
||||||
ret = DoShellExec(argv + 1);
|
ret = DoShellExec(argv + 1);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,38 +331,51 @@ char *GetCmdName(const char *cmdline, unsigned int len)
|
||||||
return cmdName;
|
return cmdName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChildExec(const char *cmdName, char *const paramArray[])
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
pid_t gid;
|
||||||
|
|
||||||
|
ret = setpgrp();
|
||||||
|
if (ret == -1) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gid = getpgrp();
|
||||||
|
if (gid < 0) {
|
||||||
|
printf("get group id failed, pgrpid %d, errno %d\n", gid, errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tcsetpgrp(STDIN_FILENO, gid);
|
||||||
|
if (ret != 0) {
|
||||||
|
printf("tcsetpgrp failed, errno %d\n", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = execve(cmdName, paramArray, NULL);
|
||||||
|
if (ret == -1) {
|
||||||
|
perror("execve");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len, const CmdParsed *cmdParsed)
|
static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len, const CmdParsed *cmdParsed)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
pid_t forkPid;
|
pid_t forkPid;
|
||||||
pid_t gid;
|
|
||||||
|
|
||||||
if (strncmp(cmdline, SHELL_EXEC_COMMAND, SHELL_EXEC_COMMAND_BYTES) == 0) {
|
if (strncmp(cmdline, CMD_EXEC_COMMAND, CMD_EXEC_COMMAND_BYTES) == 0) {
|
||||||
forkPid = fork();
|
forkPid = fork();
|
||||||
if (forkPid < 0) {
|
if (forkPid < 0) {
|
||||||
printf("Faild to fork from shell\n");
|
printf("Faild to fork from shell\n");
|
||||||
return;
|
return;
|
||||||
} else if (forkPid == 0) {
|
} else if (forkPid == 0) {
|
||||||
ret = setpgrp();
|
ChildExec(cmdParsed->paramArray[0], cmdParsed->paramArray);
|
||||||
if (ret == -1) {
|
} else {
|
||||||
exit(1);
|
waitpid(forkPid, 0, 0);
|
||||||
}
|
ret = tcsetpgrp(STDIN_FILENO, getpid());
|
||||||
|
|
||||||
gid = getpgrp();
|
|
||||||
if (gid < 0) {
|
|
||||||
printf("get group id failed, pgrpid %d, errno %d\n", gid, errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = tcsetpgrp(STDIN_FILENO, gid);
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printf("tcsetpgrp failed, errno %d\n", errno);
|
printf("tcsetpgrp failed, errno %d\n", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = execve((const char *)cmdParsed->paramArray[0], (char * const *)cmdParsed->paramArray, NULL);
|
|
||||||
if (ret == -1) {
|
|
||||||
perror("execve");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(void)syscall(__NR_shellexec, cmdName, cmdline);
|
(void)syscall(__NR_shellexec, cmdName, cmdline);
|
||||||
|
@ -419,7 +432,7 @@ unsigned int PreHandleCmdline(const char *input, char **output, unsigned int *ou
|
||||||
unsigned int removeLen = strlen("./"); /* "./" needs to be removed if it exists */
|
unsigned int removeLen = strlen("./"); /* "./" needs to be removed if it exists */
|
||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
char *newCmd = NULL;
|
char *newCmd = NULL;
|
||||||
char *execCmd = SHELL_EXEC_COMMAND;
|
char *execCmd = CMD_EXEC_COMMAND;
|
||||||
const char *cmdBuf = input;
|
const char *cmdBuf = input;
|
||||||
unsigned int cmdBufLen = strlen(cmdBuf);
|
unsigned int cmdBufLen = strlen(cmdBuf);
|
||||||
char *shiftStr = (char *)malloc(cmdBufLen + 1);
|
char *shiftStr = (char *)malloc(cmdBufLen + 1);
|
||||||
|
|
|
@ -436,17 +436,16 @@ STATIC VOID StoreReadChar(CONSOLE_CB *consoleCB, char ch, INT32 readcount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID KillPgrp()
|
VOID KillPgrp(UINT16 consoleId)
|
||||||
{
|
{
|
||||||
INT32 consoleId;
|
if ((consoleId > CONSOLE_NUM) || (consoleId <= 0)) {
|
||||||
LosProcessCB *process = OsCurrProcessGet();
|
return;
|
||||||
|
}
|
||||||
if ((process->consoleID > CONSOLE_NUM - 1) || (process->consoleID < 0)) {
|
CONSOLE_CB *consoleCB = g_console[consoleId-1];
|
||||||
|
/* the default of consoleCB->pgrpId is -1, may not be set yet, avoid killing all processes */
|
||||||
|
if (consoleCB->pgrpId < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
consoleId = process->consoleID;
|
|
||||||
CONSOLE_CB *consoleCB = g_console[consoleId];
|
|
||||||
(VOID)OsKillLock(consoleCB->pgrpId, SIGINT);
|
(VOID)OsKillLock(consoleCB->pgrpId, SIGINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ extern INT32 GetFilepOps(const struct file *filep, struct file **privFilep, cons
|
||||||
extern VOID OsWaitConsoleSendTaskPend(UINT32 taskID);
|
extern VOID OsWaitConsoleSendTaskPend(UINT32 taskID);
|
||||||
extern VOID OsWakeConsoleSendTask(VOID);
|
extern VOID OsWakeConsoleSendTask(VOID);
|
||||||
#endif
|
#endif
|
||||||
extern VOID KillPgrp(VOID);
|
extern VOID KillPgrp(UINT16 consoleId);
|
||||||
|
|
||||||
/* console ioctl */
|
/* console ioctl */
|
||||||
#define CONSOLE_IOC_MAGIC 'c'
|
#define CONSOLE_IOC_MAGIC 'c'
|
||||||
|
|
|
@ -118,14 +118,14 @@ STATIC VOID OsMagicMemCheck(VOID)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
INT32 CheckMagicKey(CHAR key)
|
INT32 CheckMagicKey(CHAR key, UINT16 consoleId)
|
||||||
{
|
{
|
||||||
#ifdef LOSCFG_ENABLE_MAGICKEY
|
#ifdef LOSCFG_ENABLE_MAGICKEY
|
||||||
INT32 i;
|
INT32 i;
|
||||||
STATIC UINT32 magicKeySwitch = 0;
|
STATIC UINT32 magicKeySwitch = 0;
|
||||||
|
|
||||||
if (key == 0x03) { /* ctrl + c */
|
if (key == 0x03) { /* ctrl + c */
|
||||||
KillPgrp();
|
KillPgrp(consoleId);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (key == 0x12) { /* ctrl + r */
|
} else if (key == 0x12) { /* ctrl + r */
|
||||||
magicKeySwitch = ~magicKeySwitch;
|
magicKeySwitch = ~magicKeySwitch;
|
||||||
|
|
|
@ -46,7 +46,7 @@ typedef struct {
|
||||||
CHAR magicKey;
|
CHAR magicKey;
|
||||||
} MagicKeyOp;
|
} MagicKeyOp;
|
||||||
|
|
||||||
extern INT32 CheckMagicKey(CHAR key);
|
extern INT32 CheckMagicKey(CHAR key, UINT16 consoleId);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue