gpt4 book ai didi

c - 为什么我的程序在 waitpid() 中停止而没有任何错误信息?

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:01 43 4
gpt4 key购买 nike

我正在编写一个简化的 shell。它使用 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 有一些错误。谁能帮帮我?

最佳答案

我终于明白了。

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

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

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

关于c - 为什么我的程序在 waitpid() 中停止而没有任何错误信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736785/

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