2015-09-27 14 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! 
相關問題