vfork执行时出现Segmentation fault

1.首先明白vfork是干什么用的?

Linux命令行下输入man vfork回车
在这里插入图片描述
看红色框里的说明,翻译过来是vfork - 创建子进程并且阻塞父进程,block n.块 v.阻塞。
在这里插入图片描述
在手册的最底部出现下面红框的BUGS,说明vfork是由BUG的。翻译为信号处理的细节是有模糊的,在系统之间有差异(不同)。BSD手册页指出:“为了避免死锁情况,vfork()从不发送SIGTTOU(后台进程企图从控制终端写信号)或SIGTTIN(后台进程企图从控制终端读信号)信号;相反,允许输出或ioctl,并且输入会导致文件结束指令。”
在这里插入图片描述

2.出现Segmentation fault错误的代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
        pid_t pid=vfork();
        if(pid==-1)
        {
                printf("Create process is fault.\n");
        }
        if(pid==0)
        {
                printf("Child process %d is running.\n",getpid());
        }
        else
        {
                printf("Parent process %d is running.\n",getpid());
        }
        return 0;
}

程序执行结果如下:
在这里插入图片描述
从程序结果可以看出,vfork是先执行子进程,然后执行父进程的,只不过这段代码出现了Segmentation fault。

3.使用strace命令跟踪一下这个程序

在Linux终端输入strace -f -s 65500 -i -T ./vfork
在这里插入图片描述
从跟踪结果中看只调用一次exit_group(0),正确的情况下应该执行两次return 0;

如何修改程序?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
        pid_t pid=vfork();
        if(pid==-1)
        {
                printf("Create process is fault.\n");
        }
        if(pid==0)
        {
                printf("Child process %d is running.\n",getpid());
        }
        else
        {
                printf("Parent process %d is running.\n",getpid());
        }
        exit(0);//将return 0;替换了,exit()函数在stdlib.h头文件中
}

执行结果为:
在这里插入图片描述
从结果看出Segmentation fault错误消失了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值