2010-04-21 12 views
6

मेरे पास एक सी प्रोग्राम है, और मैं इसे अपने सभी इनपुट को TR के साथ फ़िल्टर करना चाहता हूं। इसलिए, मैं एक बच्चे की प्रक्रिया के रूप में tr शुरू करना चाहता हूं, मेरे stdin को रीडायरेक्ट करना चाहता हूं, फिर tr के stdout को कैप्चर करें और उससे पढ़ लें।सी प्रोग्राम में किसी अन्य प्रक्रिया में stdin को रीडायरेक्ट करें

संपादित करें: यहां कोड है जो अब तक है, जो काम नहीं करता है। यह तुरंत segfaults, लेकिन मुझे समझ नहीं आता क्यों:

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

int main(int argc, char** argv){ 
    int ch; 
    int fd = stripNewlines(); 

    while((ch = getc(fd)) != EOF){ 
    putc(ch, stdout); 
    } 

    return 0; 
} 

int stripNewlines(){ 
    int fd[2], ch; 
    pipe(fd); 

    if(!fork()){ 
    close(fd[0]); 

    while((ch = getc(stdin)) != EOF){ 
     if(ch == '\n'){ continue; } 
     putc(ch, fd[1]); 
    } 

    exit(0); 
    }else{ 
    close(fd[1]); 

    return fd[0]; 
    } 
} 

संपादित करें: बाहर कर देता है यह दो बातें था: एक था कि मेरे हैडर 0 और 1 के रूप में stdin और stdout को परिभाषित नहीं किया, इसलिए मैं वास्तव में पढ़ रहा था/पूरी तरह यादृच्छिक पाइप के लिए लिखना। दूसरा यह है कि किसी कारण से getc और putc काम नहीं करता है कि मैं कैसे उम्मीद करूंगा, इसलिए मुझे इसके बजाय पढ़ने() लिखना और लिखना पड़ा। यदि मैं ऐसा करता हूं, तो यह सही है:

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

int main(int argc, char** argv){ 
    int ch; 
    int fd = stripNewlines(); 

    while(read(fd, &ch, 1) == 1){ 
    write(1, &ch, 1); 
    } 

    return 0; 
} 

int stripNewlines(){ 
    int fd[2]; 
    int ch; 
    pipe(fd); 

    if(!fork()){ 
    close(fd[0]); 

    while(read(0, &ch, 1) == 1){ 
     if(ch == '\n'){ continue; } 
     write(fd[1], &ch, 1); 
    } 

    exit(0); 
    }else{ 
    close(fd[1]); 
    return fd[0]; 
    } 
} 

उत्तर

0

कोई कारण है कि आप अपने प्रोग्राम में tr से इनपुट पाइप नहीं कर सकते हैं?

tr A-Z a-z | myprogram

+0

हाँ, लेकिन इसमें जाने के लिए जटिल है। मैं इसे प्रोग्राम के अंदर ही संभालना चाहता हूं। –

1

stdin से पढ़ना जीवन और अधिक कठिन बना देता है। यदि आप FILE * से पढ़ने के साथ रह सकते हैं, तो popen() का उपयोग tr पर करने के लिए बहुत आसान है, और FILE * से यह लौटाता है।

संपादित करें: यदि आप ऐसा नहीं कर सकते हैं, तो आपको थोड़ा सा कुरूपता प्राप्त करने की आवश्यकता है। अपने आउटपुट रीडायरेक्ट के साथ tr स्पॉन करने के लिए popen का उपयोग शुरू करें। फिर उस FILE * और stdin के साथ फ़ाइल संख्याएं प्राप्त करने के लिए fileno का उपयोग करें। अंत में, से पाइप के साथ stdin फ़ाइल डिस्क्रिप्टर को जोड़ने के लिए dup2 का उपयोग करें।

+1

हाँ, यह इतना मुश्किल बनाता है कि मुझे सवाल पूछना पड़ा। अगर मैं ऐसा कर सकता, तो मैं चाहता था। :-) –

0
#include <stdio.h> 
int main() 
{ 
    char x1[100]; 
    scanf("%[^\n]",x1); // read entire line from tr i.e., from stdin 
    printf("\n%s",x1); 
} 

और प्रयोग

टीआर को A से Z a-z | myprogram

1

popen(3) देखें। असल में आपको केवल

FILE *in = popen("tr <args>", "r"); 

और फिर in से पढ़ा गया है।

संबंधित मुद्दे