在我自己的 shell 中创建后台进程

标签 c shell unix

作为作业的一部分,我正在编写自己的 unix shell,但我无法处理创建后台进程的问题。我编写了一个信号处理函数并实现了必要的(从我的角度来看——但显然还不够好)部分到我的代码中,如下所示:

void handler(int sig)
{
    int pid;
    int status;
    pid = wait(NULL);
    printf("[%d]retval: %d \n", pid, WEXITSTATUS(status));
    fflush(stdout);
}

int main() { 
.....
....
struct sigaction sigchild; 
memset (&sigchild, 0, sizeof(sigchild)); 
sigchild.sa_handler = handler;
sigchild.sa_flags = SA_SIGINFO | SA_NOCLDWAIT;
...
...
if(isBackground)  //background process
{
    sigaction(SIGCHLD, &sigchild, 0);
}

例如,当我输入“sleep 5 &”然后输入“ps”以查看没有 sleep 的进程时。可能是什么问题?提前致谢。

最佳答案

子进程是后台进程。父进程是前台进程。 SIGCHLD是当 child 终止时发送给 parent 的信号。将 if (isbackground 更改为 if(!background)

关于在我自己的 shell 中创建后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705902/

相关文章:

c - 如何在 c 中将字符串转换为字符数组(或)如何提取单个 char 形式的字符串?

c - 使用 fread 附加到缓冲区

unix - 识别并删除 UNIX 中的空字符

linux - 使用 Perl 脚本提取 tar.gz 文件

c - 我的代码有什么问题吗? C

源代码中的条件编译

shell - 防止 POSIX xargs 尝试运行空命令

php - 我可以在没有 ssh 访问权限的情况下在 PHP 中使用 shell_exec 或反引号吗?

mysql - 使用命令行将SQL文件导入数据库时​​,使用了错误的MySQL用户

linux - 带引号的 sudo 命令行为