linux內(nèi)存管理把這個內(nèi)存空間分為了兩塊 一塊是0-3G的用戶空間,一塊是3G-4G的內(nèi)核空間。一般的程序分配內(nèi)存是在用戶空間分配。所以,這個地址是正常的。
創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設服務,提供成都網(wǎng)站制作、網(wǎng)站建設、外貿(mào)網(wǎng)站建設網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設計,成都響應式網(wǎng)站建設公司,網(wǎng)頁設計師打造企業(yè)風格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務。歡迎咨詢做網(wǎng)站需要多少錢:13518219792
malloc分配內(nèi)存的時候,是在一個線性區(qū)里面分配,每個程序都有屬于自己的線性區(qū)。如果這個地址恰好分配在不屬于自己進程的線性區(qū)里面。那么肯定是會報段錯誤。
段錯誤不是內(nèi)核空間才會發(fā)生的事情。
用戶程序只能訪問屬于自己的線性區(qū),這個線性區(qū)是屬于用戶空間的。用戶程序不能直接訪問內(nèi)核空間。
這些知識都是屬于linux內(nèi)核的。如果不清楚的話,可以看看內(nèi)核方面的書。
我這里是ubuntu x86-64,照著抄你的代碼運行非常正常。
編譯運行:
as run.s -o run.o
ld run.o -o run
./run
GDB調(diào)試也沒問題
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later ;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
;.
Find the GDB manual and other documentation resources online at:
;.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from run...done.
(gdb) b _start
Breakpoint 1 at 0x400078: file run.s, line 6.
(gdb) r
Starting program: /home/×××××××/Desktop/run
Breakpoint 1, _start () at run.s:6
6 movl $1, %eax
(gdb) ni
7 movl $0, %ebx
(gdb) ni
8 int $0x80
(gdb) ni
[Inferior 1 (process 10617) exited normally]
(gdb) b _start
如果不是自己寫的程序,建議先閱讀一下文檔
是不是文件的權(quán)限,目錄,環(huán)境變量,使用方法等有問題。
如果是自己寫的
那么出現(xiàn)段錯誤 有可能是越界等錯誤
建議GDB調(diào)試,或檢查源碼
/*************************************
文件名: server.c
linux 下socket網(wǎng)絡編程簡例 - 服務端程序
服務器端口設為 0x8888 (端口和地址可根據(jù)實際情況更改,或者使用參數(shù)傳入)
服務器地址設為 192.168.1.104
作者:kikilizhm#163.com (將#換為@)
*/
#include stdlib.h
#include sys/types.h
#include stdio.h
#include sys/socket.h
#include linux/in.h
#include string.h
int main()
{
int sfp,nfp; /* 定義兩個描述符 */
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=0x8888; /* 服務端使用端口 */
printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{
printf("socket fail ! \r\n");
return -1;
}
printf("socket ok !\r\n");
/* 填充服務器端口地址信息,以便下面使用此地址和端口監(jiān)聽 */
bzero(s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 這里地址使用全0,即所有 */
s_add.sin_port=htons(portnum);
/* 使用bind進行綁定端口 */
if(-1 == bind(sfp,(struct sockaddr *)(s_add), sizeof(struct sockaddr)))
{
printf("bind fail !\r\n");
return -1;
}
printf("bind ok !\r\n");
/* 開始監(jiān)聽相應的端口 */
if(-1 == listen(sfp,5))
{
printf("listen fail !\r\n");
return -1;
}
printf("listen ok\r\n");
char gc;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
/* accept服務端使用函數(shù),調(diào)用時即進入阻塞狀態(tài),等待用戶進行連接,在沒有客戶端進行連接時,程序停止在此處,
不會看到后面的打印,當有客戶端進行連接時,程序馬上執(zhí)行一次,然后再次循環(huán)到此處繼續(xù)等待。
此處accept的第二個參數(shù)用于獲取客戶端的端口和地址信息。
*/
nfp = accept(sfp, (struct sockaddr *)(c_add), sin_size);
if(-1 == nfp)
{
printf("accept fail !\r\n");
return -1;
}
printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
/* 這里使用write向客戶端發(fā)送信息,也可以嘗試使用其他函數(shù)實現(xiàn) */
if(-1 == write(nfp,"hello,welcome to my server \r\n",32))
{
printf("write fail!\r\n");
return -1;
}
while((gc = getchar()) != EOF) /* 按ctrl + z 鍵結(jié)束,或者給定一個特殊字符,如'#',即 hile((gc = getchar()) != '#') */
{
write(nfp,gc,1);
}
printf("write ok!\r\n");
close(nfp);
}
close(sfp);
return 0;
}
如果只有root用戶才出錯的話,而其他用戶可以成功執(zhí)行,那就先排除命令本身的問題。
你可以對比一下root用戶和可以成功執(zhí)行的用戶兩者間的環(huán)境差異,用set命令各導出一份環(huán)境變量列表,看是否哪里有不同。
另外,還可以對比檢查一下ulimit
-a,看是否不同。
有的時候,普通用戶和root的PATH和LD_LIBRARY_PATH設置的不同會導致一些異常,比如說執(zhí)行的根本不是同一個路徑下的命令。