2015-06-14 48 views
0

我想檢查cmd變量設置爲「LISTALL」,但它不是當我嘗試打印出來。C++字符數組不正確通過管道讀取

#include <stdio.h> 
#include <unistd.h> 
#include <cstring> 
#include <stdlib.h> 
#include <iostream> 
#include <sys/wait.h> 

int main(int argc, char **argv) 
{ 
    pid_t cPid = fork(); 
    int P2C[2]; 
    int C2P[2]; 
    pipe(P2C); 
    pipe(C2P); 

    char cmd[50]; 
    char* listOfProcesses = new char[1024]; 

    if (cPid == 0) 
    { 
     ... 
     read(P2C[0], cmd, 50); 
     printf("%s\n", cmd); 
     if(strcmp(cmd,"LISTALL") == 0) 
     { 
      //printf("Executing the command: %s", cmd); 
      write(C2P[1], getlistOfProcesses("ps -ax -o pid,cmd"), 1024); 
      ... 
     } 
    } 
    else if (cPid > 0) 
    { 
     ... 
     write(P2C[1], "LISTALL", 50); 
     wait(NULL); 
     read(C2P[0], listOfProcesses,1024); 
     ... 
    } 
    else 
    { 
     // fork failed 
     printf("Forking failed!\n"); 
     exit(1); 
    } 
    return 0; 
} 

我從中得到的是一個迷你盒子符號,其頂部爲00,底部爲01或02。我嘗試在這裏粘貼符號,但沒有顯示。

+0

如果'閱讀(P2C [0],CMD,1050)''然後應該cmd'是大到足以容納1050個字節。聲明'char cmd [50]'不符合這個要求。 – Oswald

+0

是啊,他們都設置爲50現在,我已經忘了改變別人的時候我張貼,感謝儘管 – ILikeToLearn

+0

「C++」和「字符數組」 #doesnotcompute –

回答

3

創建4支管:兩個父進程和兩個子進程。

在分叉前創建管道!然後fork,然後檢查你是在父進程還是在子進程中。

這樣你只有兩個管道,兩個進程都知道這些管道,並且可以通過讀取或寫入管道的相應文件描述符進行通信。

+0

謝謝,這似乎也顯示爲LISTALL,但現在它似乎並沒有真正進入if語句,它是否因爲類型差異或其他原因而認爲它們不相同? – ILikeToLearn

+0

「if」語句不相關,應該用不同的問題處理。 – Oswald

+0

好的,會做,然後再次感謝您的幫助! – ILikeToLearn