nixp.ru v3.0

28 мая 2017,
воскресенье,
07:45:55 MSK

DevOps с компанией «Флант»
SkyLimited написал 17 июля 2013 года в 09:09 (1013 просмотра) Ведет себя неопределенно; открыл 1 тему в форуме.

Всем здравствуйте.

С++

Вначале я делаю fork() Прошу прощения, что без оформления, ссылка код не работает ни в ff ни в chrome.

[code]pid_t parpid, sid;
parpid = fork();
if(parpid<0) exit(1); else if(parpid!=0) exit(0);
umask(0);
sid = setsid(); if(sid<0) exit(1); close(STDIN_FILENO); close(STDERR_FILENO); close(STDOUT_FILENO);
[/code]После этого я пытаюсь вызывать netstat таким образом: Функция:
[code]std::string exec(const char* cmd) { FILE* pipe = popen(cmd, "r"); if (!pipe) return "ERROR"; char buffer[128]; std::string result = ""; while (!feof(pipe)) { if (fgets(buffer, 128, pipe) != NULL) result += buffer; } pclose(pipe); return result; }
Сам вызов:
[/code][code]const std::string cmd = "netstat -atun"; std::string res = exec(cmd.c_str());
[/code]Однако, все зависает на строчке "fgets"
Буду благодарен за помощь.

 

rgo
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <sys/stat.h>
std::string exec(const char* cmd) { FILE* pipe = popen(cmd, "r"); if (!pipe) return "ERROR"; char buffer[128]; std::string result = ""; while (!feof(pipe)) { if (fgets(buffer, 128, pipe) != NULL) result += buffer; } pclose(pipe); return result; }
int main() { pid_t parpid, sid; parpid = fork(); if(parpid<0) exit(1); else if(parpid!=0) exit(0); umask(0); sid = setsid(); if(sid<0) exit(1); close(STDIN_FILENO); close(STDERR_FILENO); close(STDOUT_FILENO); const std::string cmd = "netstat -atun"; std::string res = exec(cmd.c_str()); std::ofstream out("tmp.out"); out << res << std::endl; }


У меня этот код работает. Складывает вывод netstat в tmp.out. Вероятно у тебя где-то в другом месте ошибка. Или ты что-то не так понял.