为什么我的程序在没有任何错误信息的情况下在waitpid()中停止?

时间:2019-08-31 09:30:48

标签: c linux

我正在编写一个简化的外壳。它使用waitpid()等待子进程终止。但是它总是在函数waitpid()中停止。

这是我的源代码:

if(fundex >= 0){
  cmd_table[fundex].fun(tokens);
} else {
  /* REPLACE this to run commands as programs. */
    pid_t cpid = fork();

    if(cpid == -1)
            printf(" --- fork error! ---");
    else if(cpid == 0){    /* exxcuted by child */

        signal(SIGINT,SIG_DFL);
        signal(SIGQUIT,SIG_DFL);
        signal(SIGTSTP,SIG_DFL);
        signal(SIGTTOU,SIG_DFL);

        pid_t pid = getpid();
        pid_t pgid = getpgid(pid);

        if(pgid == shell_pgid)
                printf("\n -- right id -- ");

        printf(" \n--pid = %d --",pid);
        printf(" \n--pgid = %d --",pgid);

        setpgid(pid,pid);
        printf("\n--pgrp is set--");        

        pid_t newPgid = getpgid(pid);
        printf(" newPgid is gotten");

        printf("\n");

        printf(" \n--new pgid = %d --",newPgid);

        tcsetpgrp(0,newPgid);

        io_redirect(tokens);

        execution(tokens);

        }
        else{   /* executed by parent */
            printf(" \n--wating --");

            waitpid(cpid,NULL,0);
            tcsetpgrp(0,shell_pgid);
        }
    }

这是gdb告诉我的:

Starting program: /home/yanghao/cs162/ta/hw1/yhshell 
0: ls


 -- right id --  
--pid = 76373 -- 
--pgid = 76372 --
--pgrp is set-- newPgid is gotten
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ac8687 in __GI___waitpid (pid=76373, stat_loc=0x0, options=0)
    at ../sysdeps/unix/sysv/linux/waitpid.c:30
warning: Source file is more recent than executable.
30    return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);

../sysdeps/unix/sysv/linux/waitpid.c:30包含以下内容:

return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);

我正在为gdb使用glibc-2.30,我的操作系统是Ubuntu 18.04.2 LTS。

所以SYSCALL_CANCEL似乎有一些错误。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我终于明白了。

问题是我看不到printf(" \n--new pgid = %d --",newPgid);printf(" \n--wating --");,因为我没有在缓冲区stdout中添加换行符。

无论如何,我的进程在io_redirect上被阻止,因为我的输入在io_redirect中产生了内存访问冲突。

我的io_direct傻瓜定义中没有任何输入检查。