2015-06-14 81 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