1. c語言在linux中怎麼改變游標
1.游標定位函數:
復制代碼代碼如下:
#include <windows.h>
#include <conio.h>
/****** 游標移到指定位置 ********************************/
void gotoxy(HANDLE hOut, int x, int y)
{
COORD pos;
pos.X = x; //橫坐標
pos.Y = y; //縱坐標
SetConsoleCursorPosition(hOut, pos);
}
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定義顯示器句柄變數
gotoxy(hOut,20,30); //游標定位在坐標(20,30)
2.顏色控制:
2.1函數實現
復制代碼代碼如下:
/******設置文本為綠色 ********************************************/
void Set_TextColor_Green (void)
{
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
2. 在linux中如何用命令查找文件在哪
需要准備的材料分別是:電腦、linux連接工具。
1、首先連接上linux主機,進入等待輸入指令的linux命令行狀態。
3. linux中C是什麼意思
沒有說清湖 你再LINUX裡面如果是VIM 那就是個字母c
如果是查詢帶C的命令 那就是《Linux就該這么學》的命令大全查看
比如
createdb命令 – 創建PostgreSQL資料庫
還有很多命令裡面有帶C的參數,大寫和小寫C c 參數代表的意義是不一樣的。
如果你要表示C語言編程上的內容,那就有事另一回事情了。比如
Linux C
4. linux c 段錯誤如何定位
1. 段錯誤是什麼
一句話來說,段錯誤是指訪問的內存超出了系統給這個程序所設定的內存空間,例如訪問了不存在的內存地址、訪問了系統保護的內存地址、訪問了只讀的內存地址等等情況。這里貼一個對於「段錯誤」的准確定義(參考Answers.com):
A segmentation fault (often shortened to segfault) is a particular error condition that can occur ring the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
2. 段錯誤產生的原因
2.1 訪問不存在的內存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = NULL;
*ptr = 0;
}
2.2 訪問系統保護的內存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *ptr = (int *)0;
*ptr = 100;
}
2.3 訪問只讀的內存地址
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *ptr = "test";
strcpy(ptr, "TEST");
}
2.4 棧溢出
#include<stdio.h>
#include<stdlib.h>
void main()
{
main();
}
等等其他原因。
3. 段錯誤信息的獲取
程序發生段錯誤時,提示信息很少,下面有幾種查看段錯誤的發生信息的途徑。
3.1 dmesg
dmesg可以在應用程序crash掉時,顯示內核中保存的相關信息。如下所示,通過dmesg命令可以查看發生段錯誤的程序名稱、引起段錯誤發生的內存地址、指令指針地址、堆棧指針地址、錯誤代碼、錯誤原因等。以程序2.3為例:
panfeng@ubuntu:~/segfault$ dmesg
[ 2329.479037] segfault3[2700]: segfault at 80484e0 ip 00d2906a sp bfbbec3c error 7 in libc-2.10.1.so[cb4000+13e000]
3.2 -g
使用gcc編譯程序的源碼時,加上-g參數,這樣可以使得生成的二進制文件中加入可以用於gdb調試的有用信息。以程序2.3為例:
panfeng@ubuntu:~/segfault$ gcc -g -o segfault3 segfault3.c
3.3 nm
使用nm命令列出二進制文件中的符號表,包括符號地址、符號類型、符號名等,這樣可以幫助定位在哪裡發生了段錯誤。以程序2.3為例:
panfeng@ubuntu:~/segfault$ nm segfault3
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
080484ec r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
08048490 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
0804848a T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048420 T __libc_csu_fini
08048430 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080484bc T _fini
080484d8 R _fp_hw
080482bc T _init
08048330 T _start
0804a014 b completed.6990
0804a00c W data_start
0804a018 b dtor_idx.6992
080483c0 t frame_mmy
080483e4 T main
U memcpy@@GLIBC_2.0
3.4 ldd
使用ldd命令查看二進製程序的共享鏈接庫依賴,包括庫的名稱、起始地址,這樣可以確定段錯誤到底是發生在了自己的程序中還是依賴的共享庫中。以程序2.3為例:
panfeng@ubuntu:~/segfault$ ldd ./segfault3
linux-gate.so.1 => (0x00e08000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00675000)
/lib/ld-linux.so.2 (0x00482000)
5. linux下C語言怎麼實時控制游標位置我沒有curses.h頭文件。有別的辦法嗎
裝 curses-devel 啊。
當然你要是想自己重寫一個 curses 我也不攔你。
沒有開發庫裝開發庫啊。
6. 關於 Linux c 的函數庫文件的 路徑問題
要學會用man,特別是man2(系統調用)和man3(C函數庫),比如:
mansqrt
會顯示需要引用的頭文件,編譯時需要的動態鏈接庫
如果重復,則需要指定手冊章節,比如
manwrite顯示的是write程序幫助,如果想看系統調用,則要輸入man2wirte
另外,/lib64:/lib:/usr/lib64:/usr/lib這些是系統預設的,不用指定
7. 如何快速定位Linux Panic出錯的代碼行
內核Panic時,一般會列印回調,並列印出當前出錯的地址:
kernel/panic.c:panic():
#ifdef CONFIG_DEBUG_BUGVERBOSE
/*
* Avoid nested stack-mping if a panic occurs ring oops processing
*/
if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
mp_stack();
#endif
而mp_stack()調用關系如下:
mp_stack() --> __mp_stack() --> show_stack() --> mp_backtrace()
mp_backtrace()會列印整個回調,例如:
[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60)
[<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24)
[<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac)
[<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)
通常,上面的回調會列印出出錯的地址。
解決方案
通過分析,要快速定位出錯的代碼行,其實就是快速查找到出錯的地址對應的代碼?
相應的工具有addr2line, gdb, objmp等,這幾個工具在How to read a Linux kernel panic?都有介紹,我們將針對上面的實例做更具體的分析。
需要提到的是,代碼的實際運行是不需要符號的,只需要地址就行。所以如果要調試代碼,必須確保調試符號已經編譯到內核中,不然,回調里頭列印的是一堆地址,根本看不到符號,那麼對於上面提到的情況二而言,將無法准確定位問題。
情況一
在代碼編譯連接時,每個函數都有起始地址和長度,這個地址是程序運行時的地址,而函數內部,每條指令相對於函數開始地址會有偏移。那麼有了地址以後,就可以定位到該地址落在哪個函數的區間內,然後找到該函數,進而通過計算偏移,定位到代碼行。
情況二
但是,如果拿到的日誌文件所在的系統版本跟當前的代碼版本不一致,那麼編譯後的地址就會有差異。那麼簡單地直接通過地址就可能找不到原來的位置,這個就可能需要回調里頭的函數名信息。先通過函數名定位到所在函數,然後通過偏移定位到代碼行。