NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: spuštění příkazu v konzoli (Linux)

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:13.8.2017 18:52

Zdravím, chtěl bych poprosit o radu, jak spustit příkaz v příkazovém řádku z programu. Zkouším to už 3 den a furt jsem nic neobjevil. Jedná se mi o to, že potřebuji spustit externí appku, která zahájí přenos videa. Když ji spustím pomocí system("raspivid -t 0 -w 640 -h 480 -rot 180 -fps 28 -o - |sudo nc -l 2222 &"); tak je sice přenos videa spuštěn, ale aplikace se dál nevykonává. Zkoušel jsem to tedy obejít spuštěním přenosu na druhém vláknu, to taky nepomohlo, jako poslední možnost mě napadlo spouštět přenos videa pomocí while cyklu v bash souboru, ani to nepomohlo... Nemáte prosím někdo nějaký nápad ? Případně mám ještě otázku, jelikož vše je v jedné aplikaci, jak poznám, když se mi někdo odpojí od TCP socketu ?

Zdrojový kód

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "PCA9685.h"

//void sendData( int sockfd, int x ) {
//  int n;

//  char buffer[32];
//  sprintf( buffer, "%d\n", x );
//  if ( (n = write( sockfd, buffer, strlen(buffer) ) ) < 0 )
//    error( const_cast<char *>( "ERROR writing to socket") );
//  buffer[n] = '\0';
//}

int position = 0;
int channel = 0;
bool stop = false;
bool isCamOn = false;

void error( char *msg ) {
  perror(  msg );
  exit(1);
}

void *runCam(void *){

int a = system("start raspivid -t 0 -w 640 -h 480 -rot 180 -fps 28 -o - |sudo nc -l 2222 &");
}
void getData( int sockfd ) {
  char buffer[6];
  int n;

  if ( (n = read(sockfd,buffer,5) ) < 0 )
     {
         printf("ERROR reading from socket\n");
         stop = true;
         return;
     }
  buffer[n] = '\0';
  channel = atoi(strtok(buffer, "-"));
  position = atoi(strtok(NULL, "-"));
}

int main() {
     int sockfd, newsockfd, portno = 51717, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;

     PCA9685 pwm;
     pwm.init(1,0x40);
     pwm.setPWMFreq (60);
     pthread_t t;

     printf( "using port #%d\n", portno );
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0)
         error( const_cast<char *>("ERROR opening socket") );
     bzero((char *) &serv_addr, sizeof(serv_addr));

     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons( portno );

     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0)
       error( const_cast<char *>( "ERROR on binding" ) );
     listen(sockfd,5);
     clilen = sizeof(cli_addr);

     //--- infinite wait on a connection ---
     while ( 1 ) {
        stop = false;
        pwm.setPWM(0,0,375);
        pwm.setPWM(1,0,355);

        printf( "waiting for new client...\n" );
        isCamOn = false;
        if ( ( newsockfd = accept( sockfd, (struct sockaddr *) &cli_addr, (socklen_t*) &clilen) ) < 0 )
            error( const_cast<char *>("ERROR on accept") );
        printf( "opened new communication with client\n" );
        while ( 1 ) {
             //---- wait for a number from client ---
             getData( newsockfd );
             if (stop == true){
                pwm.setPWM(0,0,375);
                pwm.setPWM(1,0,355);
                break;
}
             printf( "got channel: %d position: %d\n", channel, position );
            // if(channel == 666 && !isCamOn){
                //system("raspivid -t 0 -w 640 -h 480 -rot 180 -fps 28 -o - |sudo nc -l 2222 &");
//pthread_create(&t, NULL, runCam, NULL);
        //      isCamOn = true;
        //      continue;
        //      }

                 pwm.setPWM(channel, 0, position);
            //--- send  data back ?? ---
            // printf( "sending back %d\n", data );
            // sendData( newsockfd, data );
        }
       close( newsockfd );
     }
     return 0;
}
 
Odpovědět
13.8.2017 18:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.