在Windows上,以system call 呼叫 shutdown。

看板C_and_CPP作者時間15年前 (2010/09/03 18:45), 編輯推噓13(13032)
留言45則, 10人參與, 最新討論串1/1
目前就我知道的,stdlib.h 的system() 可以 System Call 一些 shell 的指令。 使用system() 會將程序暫停,呼叫作業系統,打開shell, 然後執行command。 執行完後,就繼續剛剛的程序。 我對於這個部份,很有興趣,請問有更深入的說明嗎? 而我在用 system("shutdown -s"); 會發現程序卡在那裡,推斷應該是shell找不到,shutdown命令。 還是有其他的因素? 以上如有寫錯,請予以指正,感謝。 附上程式碼 #include <stdio.h> #include <stdlib.h> int main() { system("shutdown -s"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.149.114

09/04 02:54, , 1F
有可能會被防毒擋住
09/04 02:54, 1F

09/04 03:06, , 2F
是哪個OS啊? 我剛試了一下要等一分鐘才會關機
09/04 03:06, 2F

09/04 03:15, , 3F
是在Windows XP、使用的是Dev C++。
09/04 03:15, 3F

09/04 03:19, , 4F
-t 0 ?
09/04 03:19, 4F
※ 編輯: sephiorth 來自: 61.228.36.238 (09/04 03:31)

09/04 03:37, , 5F
防毒軟體關掉後執行 shell會出現 消失 然後沒有反應
09/04 03:37, 5F

09/04 03:38, , 6F
system("shutdown -t 0"); shell出現 消失 沒反應
09/04 03:38, 6F
※ 編輯: sephiorth 來自: 61.228.36.238 (09/04 03:40)

09/04 03:55, , 7F
這只是透過shell執行外部程式而已,不稱作system call
09/04 03:55, 7F

09/04 04:03, , 8F
freesameal所言即是 這並無向系統索取服務
09/04 04:03, 8F

09/04 04:08, , 9F
程式只在user space執行 並無使用kernel space
09/04 04:08, 9F

09/04 08:14, , 10F
shutdown -s -t 0吧, 要再加-f也可以...
09/04 08:14, 10F

09/04 08:15, , 11F
不過在Windows寫的話, 不用ExitWindowsEx() API嗎?
09/04 08:15, 11F

09/04 08:16, , 12F
另外這function只能在interactive session用, 在服務
09/04 08:16, 12F

09/04 08:17, , 13F
等沒interactive session的地方是沒有效果的.
09/04 08:17, 13F

09/04 08:17, , 14F
shutdown指令也是一樣...
09/04 08:17, 14F

09/04 08:18, , 15F
服務使用的話, 須使用InitiateSystemShutdownEx() API
09/04 08:18, 15F

09/04 08:20, , 16F
不過就算是那個, 只要有使用者登入後lock screen也沒有
09/04 08:20, 16F

09/04 08:20, , 17F
效果...
09/04 08:20, 17F

09/04 13:01, , 18F
我同學之前有用DEV-C在XP上寫出來惡作劇成功很多次過
09/04 13:01, 18F

09/04 13:01, , 19F
很多人被他害慘了xd 晚點問問看他怎麼寫
09/04 13:01, 19F

09/04 13:12, , 20F
我剛測試這樣子可以
09/04 13:12, 20F

09/04 13:12, , 21F
改成C:\\Windows\\System32\\shutdown.exe -s -f -t 0
09/04 13:12, 21F

09/04 20:22, , 22F
可是我那樣寫也成功耶…拿來惡作作過XD
09/04 20:22, 22F

09/04 22:55, , 23F
感謝 herman602 確實是shell 找不到 shutdown.exe
09/04 22:55, 23F

09/04 22:56, , 24F
所以執行後 shell 找不到就 waiting一段時間後 結束
09/04 22:56, 24F

09/04 22:58, , 25F
leicheong 所說的是使用windows的api?
09/04 22:58, 25F

09/04 22:59, , 26F
平常都在Linux底下 不太擅長 windows api
09/04 22:59, 26F

09/04 23:00, , 27F
不過使用API 的確可以避免不可預期的錯誤
09/04 23:00, 27F
從結果看 的確是shell 找不到 shutdown.exe 所以需要加上絕對路徑 不過windows 的 shell 不就是 cmd(命令提示字元 可小弟從命令提示字元去試 是找的到shutdown.exe 不需打絕對路徑 用system() 所開的 shell 的環境變數 沒有這樣shutdown.exe的路徑? 而小弟平常開從 執行 -> cmd 所開的 環境變數會包含shutdown.exe的路徑? 這真是有趣的東西 ※ 編輯: sephiorth 來自: 61.231.147.188 (09/04 23:07) ※ 編輯: sephiorth 來自: 61.231.147.188 (09/04 23:08) ※ 編輯: sephiorth 來自: 61.231.147.188 (09/04 23:13)

09/04 23:36, , 28F


09/04 23:51, , 30F
嫌麻煩的話~你原本的程式加上#include <process.h>
09/04 23:51, 30F

09/04 23:51, , 31F
就可以正常運作了
09/04 23:51, 31F

09/04 23:55, , 32F
system()這個函式不需要用絕對路徑 而且就算找不到命令 也
09/04 23:55, 32F

09/04 23:56, , 33F
只是印出'XXX'不是內部或外部命令然後就終止了 不會停住
09/04 23:56, 33F

09/04 23:58, , 34F
不過我測試發現 程式只會一片黑耶 不會有什麼找不到XXX
09/04 23:58, 34F

09/05 00:42, , 35F
lausai 說得有道理 不過system("shutdown.exe -t 0")
09/05 00:42, 35F

09/05 00:44, , 36F
shell 的視窗會出現 與herman602看到的結果一樣
09/05 00:44, 36F

09/05 00:46, , 37F
沒有 "shutdown.exe不是內部或外部命令" 的訊息
09/05 00:46, 37F

09/05 00:47, , 38F
黑一陣子 程式就結束 依舊沒有反應
09/05 00:47, 38F

09/05 00:48, , 39F
而小弟觀察到一個現象 在⑤事件顯示器 -> 系統 的 log
09/05 00:48, 39F
有這個訊息 應用程式快顯: cmd.exe - 應用程式錯誤: 應用程式正常初始 (0xc0000142) 失敗。請按一下 [確定] 終止應用程式。 上微軟查找到可能的原因 因為系統管理員尚未指派使用者略過周遊檢查權限,可能就會發生這個問題。 <-- 好像幫助不大 小弟推斷 shell 其實有找到 shutdown.exe <-- 不然會出現 "shutdown.exe不是內部或外部命令" 的訊息 而shutdown.exe 可能被系統擋下來? ※ 編輯: sephiorth 來自: 61.231.147.188 (09/05 00:59)

09/05 01:18, , 40F
看起來是權限問題?
09/05 01:18, 40F

09/05 01:50, , 41F
但只要#include <process.h>
09/05 01:50, 41F

09/05 01:50, , 42F
system("shutdown.exe -t 0"); 只有這行也可以成功運作
09/05 01:50, 42F

09/05 01:50, , 43F
看起來又不太像權限問題@@
09/05 01:50, 43F

09/05 02:46, , 44F
這不是system call ...
09/05 02:46, 44F

09/05 02:47, , 45F
只是一個稱為system的function
09/05 02:47, 45F
文章代碼(AID): #1CWK9JWv (C_and_CPP)