C++ Fork子,请求子进程列表,在Linux中终止进程

ILi*_*arn 5 c++ linux fork pipe

我正在尝试创建子进程,向子进程发送命令"LISTALL".然后子进程应该向系统发出命令ps并将该列表返回给父进程.然后,父进程应选择一个进程并将其终止.这是我到目前为止所做的,但是我遇到麻烦只是让它运行起来.

#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]);
        }
    }
    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;
}
Run Code Online (Sandbox Code Playgroud)

这些是我在尝试编译时遇到的错误:

/tmp/cciTPIOZ.o: In function `getlistOfProcesses(char const*)':
test.cpp:(.text+0x53): undefined reference to `operator new[](unsigned long)'
/tmp/cciTPIOZ.o: In function `main':
test.cpp:(.text+0x166): undefined reference to `operator new[](unsigned long)'
/tmp/cciTPIOZ.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x2c0): undefined reference to `std::ios_base::Init::Init()'
test.cpp:(.text+0x2cf): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我正在编译:

cc test.cpp -o test
Run Code Online (Sandbox Code Playgroud)

Mil*_*tel 2

行号:9,53,64 发生编译错误可以使用以下方法解决:

第 9 行:FILE* pipe = popen(cmd.data(), "r");

第 53 行:write(C2P[1], getlistOfProcesses("ps").data(), 1024);

第 64 行:printf("%s",listOfProcesses.data());

原因:这些 popen、write、printf 需要 char* 作为参数,但您将它们传递给 std::string。您必须使用 std::string.data() 函数,因为它返回指向std::string对象表示的字符数组的指针。

对于第 63 行的错误,请参阅

PS:- 对于您有问题的编辑:

第 10 行:if (!pipe) return (char*)"ERROR";

第 12 行:char *result = new char[1024];

第 53 行:(第 7 行的更改)char* getlistOfProcesses(const char* cmd)

一点建议:wait(NULL);在阅读之前listOfProcesses和子exit(0);进程结束时在父进程中使用。

工作代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)