как получить вывод команды терминала в строку C [дубликат]

на сервере sql вы можете использовать SET ANSI_WARNINGS OFF следующим образом:

        using (SqlConnection conn = new SqlConnection("Data Source=XRAYGOAT\\SQLEXPRESS;Initial Catalog='Healthy Care';Integrated Security=True"))
        {
            conn.Open();

            using (var trans = conn.BeginTransaction())
            {
                try
                {
                    using cmd = new SqlCommand("", conn, trans))
                    { 

                    cmd.CommandText = "SET ANSI_WARNINGS OFF";
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = "YOUR INSERT HERE";
                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();

                    cmd.CommandText = "SET ANSI_WARNINGS ON";
                    cmd.ExecuteNonQuery();

                    trans.Commit();
                    }
                }
                catch (Exception)
                {

                    trans.Rollback();
                }

            }

            conn.Close();

        }
1
задан 10 February 2013 в 21:58
поделиться

2 ответа

Я бы поставил это как комментарий, но у меня нет достаточного количества репутации, поскольку я новичок. cd - это встроенная команда оболочки, поэтому вы хотите использовать system (). Но cd не повлияет на ваш процесс (для этого вам нужно использовать chdir ()), поэтому то, что вы действительно хотите сделать, это запустить оболочку в качестве подпроцесса через fork / exec, подключить к ней протокол stdin и stdout, затем pipe его команды на время сеанса пользователя или соединения.

Следующий код дает общую идею. Основной и ошибочный - используйте select () not usleep () для одного.

int argc2;
printf( "Server started - %d\n", getpid() );
char buf[1024] = {0};
int pid;
int pipe_fd_1[2];
int pipe_fd_2[2];
pipe( pipe_fd_1 );
pipe( pipe_fd_2 );

switch ( pid = fork() ) 
{
case -1:
    exit(1);
case 0: /* child */
    close(pipe_fd_1[1]);
    close(pipe_fd_2[0]);
    dup2( pipe_fd_1[0], STDIN_FILENO );
    dup2( pipe_fd_2[1], STDOUT_FILENO );
    execlp("/bin/bash", "bash", NULL);
default: /* parent */
    close(pipe_fd_1[0]);
    close(pipe_fd_2[1]);
    fcntl(pipe_fd_2[0], F_SETFL, fcntl(pipe_fd_2[0], F_GETFL, NULL ) | O_NONBLOCK );
    while(true)
    {
      int r = 0;
      printf( "Enter cmd:\n" );
      r = read( STDIN_FILENO, &buf, 1024 );
      if( r > 1 )
      {
        buf[r] = '\0';
        write(pipe_fd_1[1], &buf, r);
      }
      usleep(100000);
      while( ( r = read( pipe_fd_2[0], &buf, 1024 ) ) > 0 )
      {
        buf[r-1] = '\0';
        printf("%s", buf );
      }
      printf("\n");
    }
}
3
ответ дан spinkus 27 August 2018 в 21:54
поделиться

Вы хотите функцию popen ". Ниже приведен пример запуска команды ls /etc и вывода на консоль.

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char *argv[] )
{

  FILE *fp;
  int status;
  char path[1035];

  /* Open the command for reading. */
  fp = popen("/bin/ls /etc/", "r");
  if (fp == NULL) {
    printf("Failed to run command\n" );
    exit;
  }

  /* Read the output a line at a time - output it. */
  while (fgets(path, sizeof(path), fp) != NULL) {
    printf("%s", path);
  }

  /* close */
  pclose(fp);

  return 0;
}


1
ответ дан syb0rg 27 August 2018 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: