首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >后台进程返回后再次提示用户输入

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

Stack Overflow用户
提问于 2012-05-28 04:36:24
回答 1查看 898关注 0票数 2

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

代码语言:javascript
运行
复制
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);

     }

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

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

代码语言:javascript
运行
复制
 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;

}

EN

回答 1

Stack Overflow用户

发布于 2012-05-28 21:00:19

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10777087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档