मेरे पास एक सी प्रोग्राम है, और मैं इसे अपने सभी इनपुट को 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];
}
}
हाँ, लेकिन इसमें जाने के लिए जटिल है। मैं इसे प्रोग्राम के अंदर ही संभालना चाहता हूं। –