我正在编写一个简化的外壳。它使用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
似乎有一些错误。有人可以帮我吗?
答案 0 :(得分:0)
我终于明白了。
问题是我看不到printf(" \n--new pgid = %d --",newPgid);
和printf(" \n--wating --");
,因为我没有在缓冲区stdout
中添加换行符。
无论如何,我的进程在io_redirect上被阻止,因为我的输入在io_redirect
中产生了内存访问冲突。
我的io_direct
傻瓜定义中没有任何输入检查。