2017-09-07 52 views
0

我正在使用以下C++代碼(稱爲test.cpp)。我只想從控制檯讀取一個int。使用crontab運行C++程序,「cin」不會等待我的輸入

#include <iostream> 
#include <unistd.h> 
#include <limits> 
using namespace std; 
int main() 
{ 
    for (;;) 
    { 
     cout << "please make a choice" << endl; 
     int choice; 
     cin >> choice; 
     if (!cin) 
     { 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cout << "error"<< endl; 
      usleep(1000); 
     } 
     else 
     { 
      cout << "cin is: " << choice << endl; 
     } 

    } 
} 

當我手動執行它,它是好的,並且控制檯等待我的輸入。但是,當我在crontab中運行它(命令如下:53 10 * * * /root/test)時,它會打印大量內容(如下所示)。它似乎忽略了「cin」並繼續運行。有誰知道爲什麼?

在crontab中運行時,我不應該使用cin嗎?我知道這是沒有道理的,但我試圖找出原因。

please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
please make a choice 
error 
+1

你的代碼是好的,就像你說的那樣手動執行時它是有效的。使用crontab,它可以工作,cron運行你的代碼等待'cin'並跳轉到'if(!cin)'並打印'error'。你爲什麼使用cron來運行它,你想實現什麼? –

+0

cron應該等cin嗎?爲什麼會跳到第二行?我可能會最終刪除「cin」,只是對這種行爲感到好奇。 – azhu

+0

在'cin >>選項後面加''usleep(1000)'';等待輸入,如果沒有輸入,下一個時間範圍內,下一個語句會觸發並返回'error' –

回答

1

Mark Setchell在註釋注意到,cron的不任何終端連接到執行的命令的標準輸入。這是有原因的。所有由cron執行的命令都在的背景下運行,無需用戶干預。

正常情況下,所有由cron執行的程序都是通過在執行過程中從某個文件或數據庫中提取數據來處理的方式編寫的。如果你必須將任何數據傳遞給你的程序的標準輸入,那麼你需要傳遞一些信息。例如:

53 10 * * * echo "Test" | /root/test