急求:如何退出啟動時自動運行的程序?


背景:在一個嵌入式linux的機器上開發了一個程序。
自己修改了/etc/init.d中的文件,將自己的執行程序加入到文件中,成功地實現了開機自動運行,但是,不知道該怎樣退出。按鍵后,屏幕上出現了字符,但是,沒有命令提示符,也沒有執行輸入的命令。按^c 也不能夠退出。不知道該怎樣退出?

17 个解决方案

#1


如果你是寫道/etc/inittab中,用#來注釋你的那行,然后運行init
如果是用的連接文件如Sxxxx,把文件名改成Kxxxx

#2


可是,現在的情況是,我一開機,就進入到了我設置的程序中,而這個程序是一個死循環,並且不響應任何鍵盤輸入。我按鍵盤,屏幕上倒是出現了字符,但是不能夠執行命令。難道,我必須重新裝系統?此外,我的機器沒有軟驅、光驅,只有usb接口。
這種情況下,我怎么去修改文件?所以,還是要先退出這個程序吧?

#3


我想,是不是我的命令加早了點?

#4


按^c 也不能夠退出???你難道在程序中接管了這樣一個信號???
如果你的嵌入式設備上的LINUX上加入了網絡支持,並且開啟了telnet服務的話,一切就好辦法,直接從遠程登錄上去,然后再用kill -9殺掉那個進程就行了,然后再去配置文件注釋你的那個自啟動程序
如果連網絡功能都沒有,就看你的嵌入式設備上用的什么存儲器了,如果是CF卡這類的可拆的存儲芯片,就用相應的讀卡器接到PC機上,再MOUNT上,再修改配置文件,如果是NOR FLASH這樣的不可拆的芯片,並且你的文件系統都放在了上面,就需要用JTAG方式重新再燒寫一次你的BOOTLOADER,KERNEL,FILE SYSTEM

#5


情況是這樣的。我的嵌入式linux主要運行了一個XWINDOW。硬件配置上只有兩個串口和兩個USB口。現在的工作是直接使用frambuffer實現了一個圖形界面,而不是使用xwindow下的xlib。並且程序的主要工作就是通過循環讀取串口數據顯示出來。但是,平時我調試程序的時候,都是在xwindow啟動后,在xterm中啟動這個程序的。現在,我試圖通過修改/etc/init.d來實現開機自動啟動。雖然實現了開機程序的自動啟動,但是,機器就一直處於這個程序中無法退出了,包括使用^C。而如果擊鍵,屏幕上會出現我鍵入的字符,但很快又會被界面覆蓋,而且不能夠執行任何鍵入的命令。
我想知道的是,這個時候的linux是處於什么狀態,怎樣退出我的程序?謝謝!

#6


補充:
1、我的程序沒有接管^C信號
2、我的程序不支持網絡功能

#7


我想那是因為你的程序接管了串口終端,在串口中輸入的任何字符都被你的程序接收了,從而沒有讓終端管理程序處理你的終止信號,忘了問一件事,你的默認終端是串口還是其它(也就是BASH管理的是什么終端?)????
目前你沒有任何軟辦法讓你的程序停止了,主要是看一下你的串口通信程序有沒有什么可以溢出內存的地方,利用這種溢出內存的辦法讓你的程序終止,從而就可以運行到其它程序中去了
如果這種類似方法都不行的話,就只有打“存儲器”的主意了,如同我上一回復中所說的那樣

#8


啟動是grub么?
改grub,(tty0,115200)為(ttyS0,115200)
另外的機器串口連過來,開超級終端或者SecureCRT(我忘記了,好象是這么寫)

#9


謝謝各位的指點。首先是程序對串口的控制問題。我打開串口的時候並沒有接管串口,而且我的鍵盤是接在USB上的,並且鍵入字符的時候,屏幕上也有字符輸出,同時顯示出很多LINUX界面上的字符,但是很快又被我的界面遮蓋了。所以,我想應該不是串口中輸入字符都被我的程序接收了。其次,我的默認終端好象不是串口,因為我在串口上接的是通訊數據線。再次,我的程序中為了防止內存溢出采取了很多措施,兄台的方法可能不能用。如果用刷新CF卡的方法,肯定是可以的。我現在只是非常地想在現在的狀況下退出程序,不知道各位高人能否再出出主意。謝謝!

#10


補充:我現在根本就無法進入SHELL界面,所以不知道該怎樣修改GRUB。謝謝兄台指點。

#11


我明白LZ的意思了,LZ采用的輸入設備是鍵盤,輸出設備可能是LCD之類,沒有采用串口終端,啟動時就像REDHAT的啟動界面一樣,無法使用CTRL C來結束掉程序,並且只會響應CTRL ALT DEL這個熱鍵,需要登錄后才能使用CTRL C,這在PC機上也是一樣的情況,刷CF卡的方法也簡單啊,為什么不用呢???
還有就是GRUB的方法,一般說來在嵌入式上很少用GRUB,都是自己移植的BOOTLOADER,如VIVI,U-BOOT等。用GRUB的方法就是讓你將默認終端重定向到串口設備,如果是這樣的話,你的串口通信程序多半是操作的原始串口,而系統在一啟動就打開了相應的串口,你的串口程序就會打開串口失敗,從而退出,從而就達到結束它的目的了
如果你用的是U-BOOT,VIVI之類的,在啟動的時候可以改變讓你的內核使用的默認終端的,當然,你需要在內核中首先支持,你可以在網上查找如何讓你的內核支持串口終端之類的文章,我猜你現在還是可以燒內核,燒BOOTLOADER的吧?只不過無法進入到應用程序而已???!!!!

#12


謝謝兄台指點!我只是非常想知道,我這樣運行程序,是不是在系統某種初始化未完成時才會出現這種情況?有沒有什么辦法在系統啟動的時候控制系統的初始化過程?
另外還補充兩點:
1我的程序運行的時候,屏幕左下角有一個閃爍的光標。鍵入的字符就出現在這個光標處。
2程序運行一段時間后,整個屏幕就變成了一個白色的屏幕,沒有任何內容。但是,一旦鍵入任何的值,就會恢復屏幕內容。
3我沒有在串口上接任何東西,換句話講串口沒有任何輸入輸出。不知道這個是不是一個原因。
謝謝

#13


一般說來,LINUX內核完成初始化后,第一個運行的程序就是init,然后在里面啟動bash,再由此解析初始化啟動腳本,最后再啟動XWINDOW,所以首先都是由bash來接管控制台,也就是說你的CTRL C是由BASH響應並KILL掉你的進程,圖形界面往往都是從BASH來啟動的,在未登錄的情況下,你的那個BASH不會響應CTRL C信號,若要在這個過程中加以控制,我想首先得從init程序入手,去找出為什么在未登錄之前不響應CTRL C信號?即便是你想做成交互式啟動,我想也需要從這個程序入手,啟動過程如下:
init ---------- inittab -------------- rc.local

你如果僅僅只是想控制你的那個串口程序的話,建議在串口程序中規定一定的協議,由程序來互責與用戶交互,或者就直接使用串口終端的方式(這樣有一缺點就是你的使用終端的程序都會受影響)
還有一建議,就是將你的自啟動程序放在rc.local中,我上面所說的啟動過程只是一種約定,完全可以不采用這種方式,因為你的init程序可以自己編寫,你還可以完全不用rc.local文件,就如同你現在的方式一樣。

#14


補充一點:你的系統中出現你所說的現象,完全是因為對終端的管理混亂所造成的,也就是說當你按一個鍵時,產生中斷,並讀取相應的終端管理邏輯層中的一些數據,置光標位置,然后回顯字符,多半是你的系統中同時有多個程序在管理這個終端,而沒有同步措施!!!!!!

#15


謝謝兄台指點!我現在還是先按照兄台的指點重新寫了CF卡。但是,我還是想知道,怎樣才能夠在XTERM啟動了,SH也啟動后,自動啟動程序?因為這個時候,我就能夠用^c中斷程序了。順便說一下,我通過ps了解到,我的系統先啟動了xinit,然后啟動了xterm,再啟動sh。而一般我在sh中啟動程序,就不會出現白屏現象。
此外,補充一點,有朋友告訴我,白屏之所以出現,是因為我的cpu是amd的,它有一個結電模式,當沒有任何i/o時,一段時間后就會自動進入這個狀態。
謝謝!

#16


這個
我到是見過,可以控制起動順序
不過內核是重編的

#17


你找到在什么地方啟動的sh,就在哪個地方去加上你要自啟動的程序就行了
主要是去找ect目錄下的各種腳本文件,實在不行,去看你的init程序的源碼

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com