微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么程序在这个C编程或unix编程execvp系统调用中没有执行一些句子?

我有下面的程序,当我运行程序时,我感到非常困惑,为什么我的程序没有执行

int num=i; printf("it is No.%d !",num); printf("hello,I will excute execvp!");

我的程序基本上创build6个subprocess来执行executionbode()函数,然后使用execvp来重载原始程序。 但是,每次运行程序时,string“你好,我将执行execvp”永远不会显示! 另外我觉得上面这三句话在运行程序中也没有执行? 有人能告诉我为什么? 这是我的程序

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include "makeargv.h" #include "redirection.h" #include <sys/wait.h> int executionnode(int i); int main(){ pid_t childpid; int i; int row=6; for(i=0;i<row;i++) { childpid=fork(); if(childpid==0) continue; else if (childpid>0) executionnode(i); else { perror("something wrong"); exit(1); } } } int executionnode(int i){ sleep(i); printf("hello,I am process:%ldn",(long)getpid()); wait(NULL); char *execArgs[] = { "echo","Hello,World!",NULL }; int num=i; printf("it is No.%d !",I will excute execvp!"); execvp("echo",execArgs); }

有人能告诉我为什么吗? 以及如何解决它? 我觉得这真的很奇怪? 是因为execvp()函数吗? 我刚开始学习操作系统,所以我真的很困惑! 感谢你们对我的帮助!

在等待队列中唤醒进程

fork()和wait()有两个subprocess

Linux fork()和wait()

等待subprocess,但得到错误:“PID不是这个壳的孩子”

如何检查线程是否在等待?

我可以在bash中为多个并行后台进程使用相同的variables名吗?

程序卡在等待()

有没有办法等待os.remove()完成?

当孩子分叉时,fork()如何工作?

在Paralell Bash中运行Serial

你面临的问题是两种不同事物的结合:

1 – 正如tonysdg在评论中提到的那样,execvp忽略了当前的过程映像,并引用这个 :

execve()不会成功返回,调用进程的文本,数据,bss和堆栈将被加载的程序覆盖。

execvp()是execve()的前端 )

2 – 标准输出一个缓冲流,这意味着实际打印发生在换行符或缓冲区被刷新时。

在这里, Rudd Zwolinski的回答详见 这里 )

所以,现在让我们来看看这些事情是如何相互作用并产生问题的:就在你调用execvp()之前,你的输出缓冲区已经包含了前两个printf的内容 ,但是由于没有换行符,屏幕上没有任何东西被打印出来。

然后,执行execvp()并覆盖当前进程上的所有内容,这当然意味着“上一个输出缓冲区的内容会丢失。

在这里你可以找到很多方法解决这个问题,为了完整起见,我建议你在最后的printf添加n :

... printf("hello,I will excute execvp!n"); ...

然后你很好走:

$ ./soc hello,I am process:4701 hello,I am process:4702 hello,I am process:4703 hello,I am process:4704 hello,I am process:4705 hello,I am process:4706 it is No.5 !hello,I will excute execvp! Hello,World! it is No.4 !hello,World! it is No.3 !hello,World! it is No.2 !hello,World! it is No.1 !hello,World! it is No.0 !hello,World!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐