写myshell遇到的一点小问题与感慨

这两天在做myshell任务的时候,遇到了一个很诡异的问题,fork()出的子进程if(pid==0)无法printf(),调试也没有进入子进程

        pid_t pid = fork();
        if (pid < 0)
        {
            my_err("fork", __LINE__);
        }

        if (pid == 0)
        {
            printf("hellochild1");
            // int infd = dup(0);
            // int outfd = dup(1);
            div_by_pipe(0, args_cnt);
            // dup2(infd, STDIN_FILENO);
            // dup2(outfd, STDOUT_FILENO);
            printf("hellocchild2");
            exit(0);
        }

        if (pid > 0)
        {
            waitpid(pid, NULL, 0);
            printf("helloparent\n");
        }

而另外写的一个test却可以执行printf()

int main()
{
    pid_t pid=fork();
    if(pid==0)
    {
        printf("im child");//程序小就可以执行
    }
    else if(pid>0)
    {
        printf("im parent");
    }
    return 0;
}

让我以为子进程压根就没有产生,然而在daz学长的电脑上却可以执行(让我一度开始相信玄学),在询问chatgpt,在网上查找大量资料后无果,在学长的帮助下我开始尝试execl(“/bin/ls”,“ls”,“-l”,NULL)发现可以执行,然后发现学长的电脑上pritnf(“hello\n”)加上了’\n’,我加上’\n’后也可以执行,用fflush(stdout)也可以执行,可能是缓冲区存在垃圾的原因.程序直接return是因为div_by_pipe()写的有问题

        pid_t pid = fork();
        if (pid < 0)
        {
            my_err("fork", __LINE__);
        }

        if (pid == 0)
        {
            printf("hellochild1\n"); // 加'\n'也可以打印
            // fflush(stdout);//刷新缓冲区也可以打印
            // execl("/bin/ls","ls","-l",NULL);//exec函数族都可以执行
            // int infd = dup(0);
            // int outfd = dup(1);
            div_by_pipe(0, args_cnt);
            // dup2(infd, STDIN_FILENO);
            // dup2(outfd, STDOUT_FILENO);
            printf("hellocchild2\n");
            exit(0);
        }

        if (pid > 0)
        {
            waitpid(pid, NULL, 0);
            printf("helloparent\n");
        }

这不禁让我感慨编程没有玄学,翻译过来都是二进制语言,bug一定是有迹可循的

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值