[英]C++ Fork child, ask child for process list, kill a process in Linux
I'm trying to create a child process, send the child process a command "LISTALL". 我正在尝试创建子进程,向子进程发送命令“LISTALL”。 The child process should then issue the system the command ps and return that list to the parent process.
然后子进程应该向系统发出命令ps并将该列表返回给父进程。 The parent process should then choose a process and kill it.
然后,父进程应选择一个进程并将其终止。 This is what I have so far but I'm having trouble just getting it to run.
这是我到目前为止所做的,但是我遇到麻烦只是让它运行起来。
#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;
}
These are the errors I'm getting when I try to compile it: 这些是我在尝试编译时遇到的错误:
/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
I'm compiling with with: 我正在编译:
cc test.cpp -o test
Compilation Errors occurred on line number:9,53,64 can be solved by using these: 编号错误发生在行号:9,53,64可以通过使用这些来解决:
line 9: FILE* pipe = popen(cmd.data(), "r");
第9行:
FILE* pipe = popen(cmd.data(), "r");
line 53: write(C2P[1], getlistOfProcesses("ps").data(), 1024);
第53行:
write(C2P[1], getlistOfProcesses("ps").data(), 1024);
line 64: printf("%s",listOfProcesses.data());
第64行:
printf("%s",listOfProcesses.data());
Reason: These popen,write,printf requires char* as their arguments but you are passing them std::string. 原因:这些popen,write,printf需要char *作为参数,但是你传递的是std :: string。 You have to use std::string.data() function instead as it returns pointer to the character array represented by
std::string
object. 你必须使用std :: string.data()函数,因为它返回指向由
std::string
对象表示的字符数组的指针。
And for your error on line 63, refer this . 对于第63行的错误,请参阅此处 。
line 10: if (!pipe) return (char*)"ERROR";
第10行:
if (!pipe) return (char*)"ERROR";
line 12: char *result = new char[1024];
第12行:
char *result = new char[1024];
line 53: (change in line 7) char* getlistOfProcesses(const char* cmd)
第53行:(第7行更改)
char* getlistOfProcesses(const char* cmd)
A bit of advice: use wait(NULL);
一点建议:使用
wait(NULL);
in parent process before reading listOfProcesses
and exit(0);
在父进程中读取
listOfProcesses
并exit(0);
at the end of child process. 在子进程结束时。
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.