2016-03-23 14 views
1

Bazı eski sunucuları yükseltmekle görevlendirildim (ubuntu 9 -> ubuntu 14). Eski sunucuda, biz çıktı dosyası içeriği için bu biçimi kullanan bazı C komut dosyaları var:Apache web sayfasında gösterilmek üzere sistemden ('cat') çıktı nasıl alınır?

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

main(argc, argv) 
    int argc; 
    int argv; 
{ 
    printf("content-type: text/plain\n\n"); 
    printf("Normal Output...\n"); 
    system("cat /path/to/file"); 
    printf("Done...\n"); 
} 

Şimdi, bir cgi komut dosyası içine bu derlemek ve bizim eski sunucuda web çalıştırmak eğer, görüyorum/yol/to/dosya içeriği. Ancak daha yeni bir apache sunucusunda, bana kedi çıktısını göstermiyor. Komut satırında çalıştığını ve komutun aslında web'den çalıştığını biliyorum çünkü kedi çıktısını yeniden yönlendirmek için "> log" kullanabiliyorum. Bu sistem kedi çıktılarının apache ile çalışmasını sağlamak için neler yapabileceğimi bilen var mı?

DÜZENLEME: Öyle görünüyor ki, perl ile çok benzer bir şekilde yapabilirim ve aradığım şeyi alırım, bu yüzden C'ye özgü bir sorun olduğunu ve apache olmadığını düşünürdüm.

#!/usr/bin/perl 
use strict; 
use warnings; 

print "Content-type: text/plain\n\n"; 
print "Normal Output...\n"; 
system("cat /path/to/file"); 
print "Done...\n"; 

DÜZENLEME 2: Ben dosyası okunurken alternatif bir yöntem kullanan olmadan beklendiği gibi orijinal kod işe gitmek için bir yolunu

İşte beklediğiniz yapar bir perl senaryo. Metin dosyalarının içeriğini nasıl okuyacağımı değil, bu betiği yapmak için ne yapmam gerektiğini ve bunun gibi başkalarını da işe yaramadı. Fflush ekleyerek yukarıdaki kodun beklendiği gibi çalıştığını anladım. Sorgum muğlaksa üzgünüm, başka bir zamanda başkaları tarafından ele alınacak bir sorun için hızlı bir çözüm bulmaya çalışıyordum. system() man page itibaren

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

main(argc, argv) 
    int argc; 
    int argv; 
{ 
    printf("content-type: text/plain\n\n"); 
    fflush(stdout); 
    printf("Normal Output...\n"); 
    system("cat /path/to/file"); 
    printf("Done...\n"); 
} 
+0

Neden sadece "system" yerine "fopen" etc kullanılmıyor? –

+0

@EdHeal, daha iyi bir yol bulmak için bu senaryoları veya anlamı yazan kişi değilim. Diyelim ki, bu sözdizimini başka bir sunucuda kullanmakta olan epeyce betik var, ve biz de pek çok düzinelerce dosyayı bulmak ve yeniden yazmak istemiyoruz. – archlyfe

+0

Apache konfigürasyon dosyası, çalıştırılabilir dosya türlerinin listesini içerir: .php .cgi vb. Ya yapılandırma dosyanızı düzenleyin veya cgi komut dosyalarınızdaki dosya uzantısını değiştirin. –

cevap

0

: "komutu tamamlandıktan sonra sistemin() çağırarak/bin/sh -c komut ve getiri tarafından komuta belirtilen bir komutu yürütür."

Ve hepsi bu kadar. popen gibi başka bir işlem başlatabilir ve bir IO akışına geri dönerek işlemden okuyabileceğiniz/yazabileceğiniz bir şey istersiniz.

AMA! tek istediğiniz bir metin dosyasının içeriğini görüntüleyen bir C programı ise, cat'u çalıştırmak için system()'u kullanmak biraz fazladır. Eğer dosya yeni satır-ayrılmış metin içerecek biliyorsanız

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

int main (void) 
{ 
    FILE *fp; 
    char c; 

    /* Open the file */ 
    if ((fp = fopen("/path/to/file", "r")) == NULL) { 
     printf("failed to open file\n"); 
     return 1; 
    } 

    printf("content-type: text/plain\n\n"); 
    printf("Normal Output...\n"); 

    /* Print each character in the file */ 
    while ((c = fgetc(fp)) != EOF) { 
     printf("%c", c); 
    } 
    printf("\n"); 

    fclose(fp); /* close the file */ 
    printf("Done...\n"); 
    return 0; 
} 

Ayrıca, yerine fgetc ait fgets() (man page here) de kullanabilir ve bir kerede bütün satırları okumak istiyorum: Sadece C kullanın.

+0

Teşekkür ederim. İçeriği almanın ve yazdırmanın doğru yolu olduğunun farkına vardım ve geçmişte benim örnek senaryoyu yazan kişi bunu oldukça garip bir şekilde yaptı. Ben bir C programcısı değilim, sadece bir yönetici, saçma bir miktar scriptleri tekrar yazmaya gerek kalmadan çalışmayı denedim. Programımı en az iş ile istediğiniz şekilde yapmak için nasıl anladığımı anladım: strcopy'den önce "fflush (stdout)" eklemek zorunda kaldım ve sihir gibi çalışıyor. – archlyfe

+0

strcpy? Yukarıda gönderdiğiniz kodda strcpy yok –

0

Sistem yerine popen kullanabilirsiniz.

İşte

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

int main() 
{ 
     printf("content-type: text/plain\n\n"); 
     printf("Normal Output...\n"); 
     FILE *fp; 
     char buffer[1024]; 
     if((fp = popen("cat /path/to/file", "r")) != NULL) 
     { 
       while(fgets(buffer, 1024, fp) != NULL) 
       { 
         printf("%s", buffer); 
       } 
       printf("\n"); 
       printf("Done...\n"); 
     } 
} 

popen fonksiyon komutu ve Geçici dosyaya çıktı depolamak olduğunu çalıştırır, popen kodudur. Ve dosya tanıtıcısını bu geçici dosyaya döndürür.

GÜNCELLEME: -

bir ikinci yöntem vardır orada da bunu olmasıdır. Bu,

Sistem çıkışını bir dosyada saklayın ve bu dosyayı okuyun.

İşte ikinci yöntemin kodu.

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

int main() 
{ 
     printf("content-type: text/plain\n\n"); 
     printf("Normal Output...\n"); 
     FILE *fp; 
     char buffer[1024]; 
     system("cat file.txt > output.txt"); 
     if((fp = fopen("output.txt", "r")) != NULL) 
     { 
       while(fgets(buffer, 1024, fp) != NULL) 
       { 
         printf("%s", buffer); 
       } 
       printf("\n"); 
       printf("Done...\n"); 
     } 
} 
İlgili konular