Compilation errors occurred on the line number: 9.53.64 can be solved using the following:
line 9: FILE* pipe = popen(cmd.data(), "r");
line 53: write(C2P[1], getlistOfProcesses("ps").data(), 1024);
line 64: printf("%s",listOfProcesses.data());
Reason: these popen, write, printf require char * as arguments, but you pass them to std :: string. Instead, you should use the std :: string.data () function, since it returns a pointer to the character array represented by the std::string object.
And for your error on line 63, refer to this .
PS: - For your corrections:
line 10: if (!pipe) return (char*)"ERROR";
line 12: char *result = new char[1024];
line 53: (change in line 7) char* getlistOfProcesses(const char* cmd)
Some tips: use wait(NULL); in the parent process before reading listOfProcesses and exit(0); at the end of the child process.
Work code:
#include <stdio.h> #include <unistd.h> #include <cstring> #include <stdlib.h> #include <iostream> #include <sys/wait.h> char* getlistOfProcesses(const char* cmd) { FILE* pipe = popen(cmd, "r"); if (!pipe) return (char*)"ERROR"; char buffer[128]; char *result = new char[1024]; while(!feof(pipe)) { if(fgets(buffer, 128, pipe) != NULL) strcat(result, buffer); } pclose(pipe); return result; } int spawnGEdit() { pid_t gPid = fork(); if(gPid == 0) { execl("gedit", "gedit", NULL); exit(-1); } else { } return 0; } int main(int argc, char **argv) { int P2C[2]; int C2P[2]; pipe(P2C); pipe(C2P); pid_t cPid = fork(); char cmd[50]; char* listOfProcesses = new char[1024]; spawnGEdit(); if (cPid == 0) { close(P2C[1]); close(C2P[0]); read(P2C[0], cmd, 10); if(strcmp(cmd,"LISTALL") == 0) { write(C2P[1], getlistOfProcesses("ps"), 1024); close(P2C[0]); close(C2P[1]); } exit(0); } else if (cPid > 0) { close(C2P[1]); close(P2C[0]); write(P2C[1], "LISTALL", 10); wait(NULL); read(C2P[0], listOfProcesses,1024); printf("%s",listOfProcesses); //TODO //get user input of a PID //kill the PID close(C2P[0]); close(P2C[1]); } else { // fork failed printf("Forking failed!\n"); exit(1); } return 0; }