gpt4 book ai didi

c - 后台进程返回后再次提示用户输入

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:05 24 4
gpt4 key购买 nike

我正在尝试构建作业控制 shell,目前正在处理后台进程。在这个程序中,我 fork 一个子进程来处理每个后台进程,并且在 fork 之后立即得到提示。但问题是,当后台进程返回时,它再次打印出提示信息。有人可以帮我解决这个问题吗?谢谢##

char prompt[] = "myShell";
set_sighandler_SIGCHLD(); //wait for background process return
while(1){
char cmd[BUFFERSIZE] = "";
write(1, prompt, sizeof(prompt));
if(read(0, cmd, 1024) <= 1)){
//parse command
//and execute
}
}
//Here is the background process.
int put_to_background(int (*func)(char** arg), char ** cmd){
pid_t pid;
if((pid = fork()) < 0){
perror("fork");
return -1;
}
else if(pid == 0){
func(cmd); //call the function the execute the command
_exit(0);
}
else{
if(setpgid(pid, 0)){
perror("setpgid");
return -1;
}
printf("running: %d\n", pid);

}

我调用函数后,它立即打印出提示“myShell”(这是我所期望的),但在后台进程返回后它又打印了一次。

我还在研究信号处理......

 JobList list;
void sighandler(int signum, siginfo_t *sip, void *ucp){
if(signum == SIGCHLD){
pid_t pid;
while((pid = waitpid(-1, NULL, WNOHANG)) > 0){
Job * job = (Job*)malloc(sizeof(Job));
job->pid = pid;
insert(&list, job);
}
}
else if(signum == SIGTTOU){
printf("SIGTTOU: pid = %d\n", (int) sip->si_pid);
}
else if(signum == SIGTTIN){
printf("SIGTTIN: pid = %d\n", (int) sip->si_pid);
}
}

int set_sighandler_SIGCHLD(){

struct sigaction sa;
sigemptyset(&sa.sa_mask);

sigaddset(&sa.sa_mask, SIGCHLD);
sigaddset(&sa.sa_mask, SIGTTIN);
sigaddset(&sa.sa_mask, SIGTTOU);
sa.sa_sigaction = sighandler;
sa.sa_flags = SA_SIGINFO;
//sigprocmask(SIG_BLOCK, &sa.sa_mask, NULL);

if(sigaction(SIGCHLD, &sa, NULL)){
perror("sigaction");
return -1;
}
if(sigaction(SIGTTOU, &sa, NULL)){
perror("sigaction");
return -1;
}
if(sigaction(SIGTTIN, &sa, NULL)){
perror("sigaction");
return -1;
}
return 0;

最佳答案

read 循环被信号中断,因此您打印提示。 (也就是说,当信号到达时,read 立即返回。)您可以检查 read 是否返回 -1 并且由于 EINTR 而返回,或者尝试设置 SA_RESTART 到信号处理程序。请注意,SA_RESTART 并不总是有效(取决于实现,各种实现中存在许多错误),IMO,最好避免。

关于c - 后台进程返回后再次提示用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com