Я использовал бы popen () (++ waqas) .
, Но иногда Вам нужны чтение и запись...
кажется, что никто не делает вещи твердый путь больше.
(Принятие среды Unix/Linux/Mac или возможно Windows со слоем совместимости POSIX...)
enum PIPE_FILE_DESCRIPTERS
{
READ_FD = 0,
WRITE_FD = 1
};
enum CONSTANTS
{
BUFFER_SIZE = 100
};
int
main()
{
int parentToChild[2];
int childToParent[2];
pid_t pid;
string dataReadFromChild;
char buffer[BUFFER_SIZE + 1];
ssize_t readResult;
int status;
ASSERT_IS(0, pipe(parentToChild));
ASSERT_IS(0, pipe(childToParent));
switch (pid = fork())
{
case -1:
FAIL("Fork failed");
exit(-1);
case 0: /* Child */
ASSERT_NOT(-1, dup2(parentToChild[READ_FD], STDIN_FILENO));
ASSERT_NOT(-1, dup2(childToParent[WRITE_FD], STDOUT_FILENO));
ASSERT_NOT(-1, dup2(childToParent[WRITE_FD], STDERR_FILENO));
ASSERT_IS(0, close(parentToChild [WRITE_FD]));
ASSERT_IS(0, close(childToParent [READ_FD]));
/* file, arg0, arg1, arg2 */
execlp("ls", "ls", "-al", "--color");
FAIL("This line should never be reached!!!");
exit(-1);
default: /* Parent */
cout << "Child " << pid << " process running..." << endl;
ASSERT_IS(0, close(parentToChild [READ_FD]));
ASSERT_IS(0, close(childToParent [WRITE_FD]));
while (true)
{
switch (readResult = read(childToParent[READ_FD],
buffer, BUFFER_SIZE))
{
case 0: /* End-of-File, or non-blocking read. */
cout << "End of file reached..." << endl
<< "Data received was ("
<< dataReadFromChild.size() << "): " << endl
<< dataReadFromChild << endl;
ASSERT_IS(pid, waitpid(pid, & status, 0));
cout << endl
<< "Child exit staus is: " << WEXITSTATUS(status) << endl
<< endl;
exit(0);
case -1:
if ((errno == EINTR) || (errno == EAGAIN))
{
errno = 0;
break;
}
else
{
FAIL("read() failed");
exit(-1);
}
default:
dataReadFromChild . append(buffer, readResult);
break;
}
} /* while (true) */
} /* switch (pid = fork())*/
}
<час> Вы также могли бы хотеть играть вокруг с выбором () и неблокирующиеся чтения.
fd_set readfds;
struct timeval timeout;
timeout.tv_sec = 0; /* Seconds */
timeout.tv_usec = 1000; /* Microseconds */
FD_ZERO(&readfds);
FD_SET(childToParent[READ_FD], &readfds);
switch (select (1 + childToParent[READ_FD], &readfds, (fd_set*)NULL, (fd_set*)NULL, & timeout))
{
case 0: /* Timeout expired */
break;
case -1:
if ((errno == EINTR) || (errno == EAGAIN))
{
errno = 0;
break;
}
else
{
FAIL("Select() Failed");
exit(-1);
}
case 1: /* We have input */
readResult = read(childToParent[READ_FD], buffer, BUFFER_SIZE);
// However you want to handle it...
break;
default:
FAIL("How did we see input on more than one file descriptor?");
exit(-1);
}
Castle MonoRails :) Для ближайшей функции динамических данных asp.net, такой как инструмент / фреймворк, или я должен сказать, что это наоборот, поскольку MonoRail отсутствовал до DD.
http://www.castleproject.org/monorail/
MonoRail был вдохновлен Ruby on Rails, и это то, чем вдохновлен DD.
EDIT:
Я тоже искал, но не знаю любые другие DD-подобные решения, которые также поддерживают L2S / EF. Фактически, я не нашел никаких других DD-подобных решений на этот счет, кроме MonoRail с ActiveRecord.
Castle MonoRail использует ActiveRecord, который использует NHibernate. Хотя NHibernate не является L2S или EF, это ORM, и, по мнению большинства (возможно, всех), на данный момент он более зрелый. Активная запись ' Реализация s делает большую часть тяжелой работы за вас из того, что я читал, поэтому она предоставит вам лучшую альтернативу решению, подобному DD.
Я думаю, что это самое близкое к этому моменту, если вы не хотите использовать DD.
Древовидные таблицы со ссылками на себя трудно обрабатывать, несмотря ни на что.
Если вы ищете ORM, я настоятельно рекомендую LLBLGen. Если вы ищете «фреймворк», я бы сказал вам: ASP.NET - это фреймворк :) Используйте его по назначению, и жизнь будет неплохой.
Древовидные таблицы со ссылками на себя трудно обрабатывать, несмотря ни на что. Это даже стоит того, когда у вас могут быть графы, например, у узла может быть более одного родителя. Затем вы должны подумать, можно ли иметь циклы.
Поэтому я думаю, что вам понадобится пользовательский FieldTemplates или пользовательский PageTemplates .
Таким образом, вы можете использовать настраиваемый элемент управления для древовидных отношений с саморегулированием, но использовать стандартные динамические данные для создания форм для всех простых полей. Или создайте "рукописную" страницу для редактирования дерева, а затем сделайте ссылку на динамические данные для редактирования простых полей на каждом узле.
Извините, я не думаю, что у вас будет готовое решение, так как нужный вам пользовательский интерфейс настолько зависит от домена вашего приложения.
SubSonic 3.0 имеет Scaffolding для ASP.Net, но я не уверен, что это касается фильтрации и сортировки ...