2012-10-13 39 views
0

我想用C系統函數寫別名工作,這裏的代碼alias命令下不繫統的功能在C

if (argc <= 3) { 
    printf("Program Usage: ./executable alias > or <or>> or &\n"); 
} 
else { 
    if (strcmp(argv[1],"alias") == 0) { 
     if (strcmp(argv[2], "redirect") == 0) { 
      char y[] = "=\">\""; 
      char *xs = strcat(argv[1], " "); 
      char *x = strcat(xs, strcat(argv[3], y)); 
      printf("%s\n",x); 
      int status = system(x); 
      printf("%d\n", status); 
     } 
     else { 
      printf("You've not entered proper symbol\n"); 
     } 
    } 
    else { 
     printf("You've not entered the shell property as alias\n"); 
    } 
} 

運行程序的一般方法是

./a.out alias redirect custom_alias_name 

此外系統函數返回0,但是當我檢查使用別名命令它不顯示當前別名。

回答

1

這是因爲,調用system()將不會修改父環境的狀態。程序在執行時會繼承父進程的環境。此繼承的環境副本對於子進程是本地的。一旦這個子進程存在,任何對這個本地環境的改變都會被丟棄。

+0

@xkOder所以,你的意思是說,在我運行程序後,別名按需要工作,但在程序執行完成後,它會返回到正常狀態。 – droidlabour

+0

@JayPrakashSarma是的,正好。 – xk0der

+0

@xkOder即使在程序退出後,是否還有任何方法可以反映別名更改? – droidlabour

-1

返回的值是命令的狀態,0表示成功,-1表示錯誤;在這種情況下,system()返回0!

+0

system()返回應該像wait()的狀態變量一樣解釋的值,如果分支失敗,則返回-1。 – BatchyX

+0

system()手冊頁:返回的值在錯誤時爲-1,否則爲該命令的返回狀態。我不同意你的-1! – b3h3m0th

+0

真正的system()手冊頁:'返回的值在出錯時爲-1(例如fork(2)失敗),否則返回該命令的狀態。後者的返回狀態採用wait(2)中指定的格式。因此,該命令的退出代碼將爲WEXITSTATUS(狀態)。「 – BatchyX