2015-09-27 15 views
0

我有以下的程序,当我运行该程序,我觉得真的很困惑的是,为什么我的程序没有EXCUTE为什么程序在这个C编程或unix编程(execvp()系统调用)中没有执行某些语句?

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

我的程序基本上创建6个进程EXCUTE executionbode()函数,然后用execvp超载原始程序。但是,每次运行程序时,字符串“你好,我将执行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:%ld\n",(long)getpid()); 
    wait(NULL); 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    int num=i; 
    printf("it is No.%d !",num); 
    printf("hello , I will excute execvp!"); 
    execvp("echo", execArgs); 

} 

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

+2

1)使用调试器2)阅读'wait'的手册页 – Olaf

+0

这里有个提示:谁是子进程在等待,为什么?回答这个问题将会很快解决您的问题。另外,更确切地说,'execvp'会覆盖* current *过程映像。 – tonysdg

回答

1

你所面临的问题是两个不同的东西结合的结果:

- 作为tonysdg在评论中提到,execvp overwites当前的进程映像,并引述this

的execve()成功不返回,和文字,数据,BSS和 堆栈调用进程是由加载的程序 的覆盖。

execvp()是前端为execve()

- 该stdout是缓冲流,这意味着实际的打印时发生换行符被找到或缓冲区被刷新。

(见更多关于这个在陆克文Zwolinski的答案here


所以,现在,让我们来看看如何将这些东西互动,并产生您的问题: 你打电话就在execvp()你的输出缓冲器已经包含以前的两个内容printf的,但是由于没有换行符,因此屏幕上不会显示任何内容。

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

Here你可以找到很多方法来解决这个问题,并且只是为了完整性,我建议你添加\n到最终printf

... 
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 , I will excute execvp! 
Hello, World! 
it is No.3 !hello , I will excute execvp! 
Hello, World! 
it is No.2 !hello , I will excute execvp! 
Hello, World! 
it is No.1 !hello , I will excute execvp! 
Hello, World! 
it is No.0 !hello , I will excute execvp! 
Hello, World! 
相关问题