2013-02-13 45 views
9

मेरे पास एक असाइनमेंट है जिस पर मैं काम कर रहा हूं और मुझे इसे खत्म करने में कठिनाई हो रही है। विचार एक प्रोग्राम लिखना है यदि if.c एक प्रोग्राम निष्पादित करता है और यदि यह सफल होता है तो यह दूसरा प्रोग्राम निष्पादित करता है। मुझे पहले प्रोग्राम के मानक आउटपुट को दबाने और दूसरे के लिए मानक आउटपुट को अपनाना है। मुझे कई परीक्षणों पर त्रुटि संदेश मिल रहा है। उदाहरण के लिए: "./if गूंज नहीं, फिर हां" रिटर्न "गूंज गूंजें: त्रुटि लिखें: खराब फ़ाइल वर्णनकर्ता"। मैंने यह पता लगाने की कोशिश की है कि मैं ऑनलाइन गलत क्या कर रहा हूं लेकिन कोई भाग्य नहीं है।सी में, मैं SP2OUT_FILENO को dup2 का उपयोग करके/dev/null पर रीडायरेक्ट कैसे करूं और उसके बाद बाद में अपने मूल मान पर रीडायरेक्ट कर सकता हूं?

#include <fcntl.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include "tlpi_hdr.h" 

int main(int argc, char *argv[]) 
{ 
    if(argc < 4){ 
     fprintf(stderr,"Incorrect number of arguments.\n"); 
     exit(EXIT_FAILURE); 
    } 

    int thenArg = 0; 
    char then[4]; 
    strcpy(then,"then"); 
    for(int x=1; x<argc; x++){ 
     if(strncmp(argv[x], then, 4) == 0) thenArg = x; 
    } 

    if(thenArg == 0){ 
     fprintf(stderr,"No 'then' argument found.\n"); 
     exit(EXIT_FAILURE); 
    } 

    int save_out = dup(STDOUT_FILENO); 
    if(save_out == -1){ 
     fprintf(stderr,"Error in dup(STDOUT_FILENO)\n"); 
     exit(EXIT_FAILURE); 
    } 

    int devNull = open("/dev/null",0); 
    if(devNull == -1){ 
     fprintf(stderr,"Error in open('/dev/null',0)\n"); 
     exit(EXIT_FAILURE); 
    } 

    int dup2Result = dup2(devNull, STDOUT_FILENO); 
    if(dup2Result == -1) { 
     fprintf(stderr,"Error in dup2(devNull, STDOUT_FILENO)\n"); 
     exit(EXIT_FAILURE); 
    } 

    int program1argLocation = 1; 
    int program2argLocation = thenArg + 1; 
    int program1argCount = thenArg-1; 
    int program2argCount = argc-(program2argLocation); 
    char *program1args[program1argCount+1]; 
    char *program2args[program2argCount+1]; 

    for(int i=0; i<program1argCount; i++){ 
     program1args[i]=argv[program1argLocation + i]; 
    } 
    program1args[program1argCount] = NULL; 
    for(int i=0; i<program2argCount; i++){ 
     program2args[i]=argv[program2argLocation + i]; 
    } 
    program2args[program2argCount] = NULL; 

    pid_t pid = fork(); 
    int child_status; 
    switch (pid) { 
    case -1: 
     fprintf(stderr,"Fork failed\n"); 
     exit(EXIT_FAILURE); 

    case 0: //child 
     //child will run program 1 
     if(execvp(program1args[0],&program1args[0]) == -1){ 
      fprintf(stderr,"Program 1 Failed.\n"); 
      exit(EXIT_FAILURE); 
     } 

    default: //parent 
     //parent will run program2 
     pid = wait(&child_status); 

     if(WEXITSTATUS(child_status) == 0){ 
      dup2(save_out, STDOUT_FILENO); 

      int prog2status = execvp(program2args[0],&program2args[0]); 
      if(prog2status == -1) { 
       fprintf(stderr,"Program 2 failed.\n"); 
       exit(EXIT_FAILURE); 
      } 
     } 
    } 

} 
+0

'चार तो [ 4]; strcpy (फिर, "फिर"); 'एक बफर ओवरफ्लो है। आप सिर्फ 'अगर (0 == strcmp (argv [x], "तब"))' या 'if (0 == strncmp (argv [x]," फिर ", 4)) का उपयोग क्यों नहीं करते? – nneonneo

+0

मुझे लगता है कि मैंने कोशिश की कि पहली बार मैंने इसे लागू किया और किसी प्रकार की त्रुटि में भाग गया। मुझे यह याद होगा और अगली बार जब मैं एक ही चीज़ में आऊंगा तो इसे वापस देखें। धन्यवाद! सी तक अभी तक उपयोग नहीं किया गया है, इसलिए इस तरह का कोई भी इनपुट बहुत अच्छा है। – Frank

उत्तर

15

आपका त्रुटि यहाँ है:

यहाँ मेरी कोड है

int devNull = open("/dev/null",0); 

devNullSTDOUT_FILENO के रूप में उपयोग करने के लिए, यह लिखने के लिए खोला जाना चाहिए:

int devNull = open("/dev/null", O_WRONLY); 
+0

धन्यवाद! मैंने वास्तव में जवाब देने से पहले ही उसी समाधान को पाया। मैंने आपको ऊपर उठाने की कोशिश की लेकिन स्पष्ट रूप से मैं ऐसा नहीं कर सकता, अभी तक। मैं भविष्य में ढेर ओवरफ्लो का उपयोग करने के लिए उत्साहित हूं! यह एक अद्भुत संसाधन है। – Frank