PDA

View Full Version : Linux programming | Chương trình C đầu tiên của bạn trên Linux



Kevin Hoang
29-09-2007, 12:12 AM
Sau khi cài xong gcc.
Để xem thông tin về bản GCC của bạn gõ lệnh: man gcc

Nào bắt đầu viết chương trình đầu tiên:

Gõ lệnh: gedit để mở Editor:

Sau đó đưa đoạn code sau vào: (Trông đoạn code này quen quen)

#include <stdio.h>

int main()
{
printf("Hello, world!\n");
return 0;
}

Lưu lại với file program1.c
Compiling bằng lệnh: gcc -o program1 program1.c

Chạy chương trình bằng lệnh: ./program1

Chương trình số 2:

#include <stdio.h>

int main()
{
int n;
puts("Please enter a number: ");
scanf("%d", &n);
printf("The number is %d \n", n);
}

Lưu lại với file là program2.c

Compiling: gcc -o program2 program2.c
Run: ./program2

Chúc mọi người học tập tốt!

hieubm
29-09-2007, 10:09 AM
DR có biết lệnh nào tuơng tự với getch() trên Turbo C không ? Mình thử #include <conio.h> thì nó báo lỗi không có file.

Kevin Hoang
29-09-2007, 02:46 PM
DR có biết lệnh nào tuơng tự với getch() trên Turbo C không ? Mình thử #include <conio.h> thì nó báo lỗi không có file.

Xem chương trình này, nó sẽ giải đáp được câu hỏi này của bạn:


/* ************************************************** *************************
*
* Copyright 1992-2005 by Pete Wilson All Rights Reserved
* 50 Staples Street : Lowell Massachusetts 01851 : USA
* http://www.pwilson.net/ pete at pwilson dot net +1 978-454-4547
*
* This item is free software: you can redistribute it and/or modify it as
* long as you preserve this copyright notice. Pete Wilson prepared this item
* hoping it might be useful, but it has NO WARRANTY WHATEVER, not even any
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
************************************************** ************************* */

/* ************************************************** *************************
*
* KBHIT.C
*
* Based on the work of W. Richard Stevens in "Advanced Programming in
* the Unix Environment," Addison-Wesley; and of Floyd Davidson.
*
* Contains these functions:
*
* To set the TTY mode:
* tty_set_raw() Unix setup to read a character at a time.
* tty_set_cooked() Unix setup to reverse tty_set_raw()
*
* To read keyboard input:
* kb_getc() keyboard get character, NON-BLOCKING. If a char
* has been typed, return it. Else return 0.
* kb_getc_w() kb get char with wait: BLOCKING. Wait for a char
* to be typed and return it.
*
* How to use:
* tty_set_raw() set the TTY mode to read one char at a time.
* kb_getc() read chars one by one.
* tty_set_cooked() VERY IMPORTANT: restore cooked mode when done.
*
* Revision History:
*
* DATE DESCRIPTION
* ----------- --------------------------------------------
* 12-jan-2002 new
* 20-aug-2002 cleanup
* 24-nov-2003 Fixed kb_getc() so that it really is non blocking(JH)
* 10-sep-2006 Let kb_getc() work right under certain Unix/Linux flavors
*
************************************************** ************************* */

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>

#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif

extern int errno;

static struct termios termattr, save_termattr;
static int ttysavefd = -1;
static enum
{
RESET, RAW, CBREAK
} ttystate = RESET;

/* ************************************************** *************************
*
* set_tty_raw(), put the user's TTY in one-character-at-a-time mode.
* returns 0 on success, -1 on failure.
*
************************************************** ************************* */
int
set_tty_raw(void)
{
int i;

i = tcgetattr (STDIN_FILENO, &termattr);
if (i < 0)
{
printf("tcgetattr() returned %d for fildes=%d\n",i,STDIN_FILENO);
perror ("");
return -1;
}
save_termattr = termattr;

termattr.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
termattr.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
termattr.c_cflag &= ~(CSIZE | PARENB);
termattr.c_cflag |= CS8;
termattr.c_oflag &= ~(OPOST);

termattr.c_cc[VMIN] = 1; /* or 0 for some Unices; see note 1 */
termattr.c_cc[VTIME] = 0;

i = tcsetattr (STDIN_FILENO, TCSANOW, &termattr);
if (i < 0)
{
printf("tcsetattr() returned %d for fildes=%d\n",i,STDIN_FILENO);
perror("");
return -1;
}

ttystate = RAW;
ttysavefd = STDIN_FILENO;

return 0;
}

/* ************************************************** *************************
*
* set_tty_cbreak(), put the user's TTY in cbreak mode.
* returns 0 on success, -1 on failure.
*
************************************************** ************************* */
int
set_tty_cbreak()
{
int i;

i = tcgetattr (STDIN_FILENO, &termattr);
if (i < 0)
{
printf("tcgetattr() returned %d for fildes=%d\n",i,STDIN_FILENO);
perror ("");
return -1;
}

save_termattr = termattr;

termattr.c_lflag &= ~(ECHO | ICANON);
termattr.c_cc[VMIN] = 1;
termattr.c_cc[VTIME] = 0;

i = tcsetattr (STDIN_FILENO, TCSANOW, &termattr);
if (i < 0)
{
printf("tcsetattr() returned %d for fildes=%d\n",i,STDIN_FILENO);
perror ("");
return -1;
}
ttystate = CBREAK;
ttysavefd = STDIN_FILENO;

return 0;
}

/* ************************************************** *************************
*
* set_tty_cooked(), restore normal TTY mode. Very important to call
* the function before exiting else the TTY won't be too usable.
* returns 0 on success, -1 on failure.
*
************************************************** ************************* */
int
set_tty_cooked()
{
int i;
if (ttystate != CBREAK && ttystate != RAW)
{
return 0;
}
i = tcsetattr (STDIN_FILENO, TCSAFLUSH, &save_termattr);
if (i < 0)
{
return -1;
}
ttystate = RESET;
return 0;
}

/* ************************************************** *************************
*
* kb_getc(), if there's a typed character waiting to be read,
* return it; else return 0.
* 10-sep-2006: kb_getc() fails (it hangs on the read() and never returns
* until a char is typed) under some Unix/Linux versions: ubuntu, suse, and
* maybe others. To make it work, please uncomment two source lines below.
*
************************************************** ************************* */
unsigned char
kb_getc(void)
{
int i;
unsigned char ch;
ssize_t size;
/* termattr.c_cc[VMIN] = 0; */ /* uncomment if needed */
i = tcsetattr (STDIN_FILENO, TCSANOW, &termattr);
size = read (STDIN_FILENO, &ch, 1);
/* termattr.c_cc[VMIN] = 1; */ /* uncomment if needed */
i = tcsetattr (STDIN_FILENO, TCSANOW, &termattr);
if (size == 0)
{
return 0;
}
else
{
return ch;
}
}

/* ************************************************** *************************
*
* kb_getc_w(), wait for a character to be typed and return it.
*
************************************************** ************************* */
unsigned char
kb_getc_w(void)
{
unsigned char ch;
size_t size;

while (1)
{

usleep(20000); /* 1/50th second: thanks, Floyd! */

size = read (STDIN_FILENO, &ch, 1);
if (size > 0)
{
break;
}
}
return ch;
}


#define TEST
#ifdef TEST

void echo(unsigned char ch);

static enum
{
CH_ONLY, CH_HEX
} how_echo = CH_ONLY;

int
main(int argc, char * argv[])
{
unsigned char ch;

printf("Test Unix single-character input.\n");

set_tty_raw(); /* set up character-at-a-time */

while (1) /* wait here for a typed char */
{
usleep(20000); /* 1/50th second: thanks, Floyd! */
ch = kb_getc(); /* char typed by user? */
if (0x03 == ch) /* might be control-C */
{
set_tty_cooked(); /* control-C, restore normal TTY mode */
return 1; /* and get out */
}
echo(ch); /* not control-C, echo it */
}
}

void
echo(unsigned char ch)
{
switch (how_echo)
{
case CH_HEX:
printf("%c,0x%x ",ch,ch);
break;
default:
case CH_ONLY:
printf("%c", ch);
break;
}

fflush(stdout); /* push it out */
}

#endif /* test */


#ifdef __cplusplus
}
#endif

phihong113
18-10-2007, 05:59 PM
ban thu de them dong nay truoc khi bien dich:
#gcc -o <ten file> -lb conio

cadimodovn
19-10-2007, 09:14 AM
DR có biết lệnh nào tuơng tự với getch() trên Turbo C không ? Mình thử #include <conio.h> thì nó báo lỗi không có file.
Theo mình biết thì trong Linux, không có hỗ trợ các hàm liên quan tới dos(dos.h, conio.h hay graph.h...), do đó khi bạn viết chương trình C trong linux, bạn không thể dùng các hàm này.(getch() nằm trong conio.h). Mình thấy chương trình của bạn Dreaminess đưa cũng khá hay, mô phỏng giống lệnh getch() trong Linux. Mình mới đọc thôi, chua chạy thử, để mình chạy thử xem.D:

kipu
24-03-2009, 01:32 AM
DR có biết lệnh nào tuơng tự với getch() trên Turbo C không ? Mình thử #include <conio.h> thì nó báo lỗi không có file.
Bạn có thể dùng cái này:
http://www.ibiblio.org/pub/historic-linux/ftp-archives/sunsite.unc.edu/Sep-29-1996/libs/linux-conio.tgz

hoặc:
http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/

thangbom77
24-03-2009, 09:37 PM
dùng c-free để chạy các code kia cho nhanh :)



#include <stdio.h>
int main()
{
int age;
char name[10];
printf("Nhap ten cua ban:\n");
scanf("%s",&name);
printf("Nhap tuoi cua ban di:\n");
scanf("%d",&age);
printf("%s oi ,tuoi cua ban va ten cua ban khong hop nhau, ban suot ngheo kho, hi hi\n",name);
printf("Chyen nghe di fox %s, hoc lap trinh khong lam cho ban giau nhu ban nghi dau\n",name);
return 0;
}

Xcross87
24-03-2009, 09:58 PM
dùng c-free để chạy các code kia cho nhanh :)

thế CFree dùng compiler gì, cái đó có run trên linux không? Bạn có đọc từ đầu đến cuối không? đã xem tiêu đề bài viết chưa?

talachjcken
12-04-2009, 02:24 PM
Theo mình biết thì trong Linux, không có hỗ trợ các hàm liên quan tới dos(dos.h, conio.h hay graph.h...), do đó khi bạn viết chương trình C trong linux, bạn không thể dùng các hàm này.(getch() nằm trong conio.h). Mình thấy chương trình của bạn Dreaminess đưa cũng khá hay, mô phỏng giống lệnh getch() trong Linux. Mình mới đọc thôi, chua chạy thử, để mình chạy thử xem.D:

Bạn chưa chạy thử mà đã khen hay là sao . Mà trong chương trình học thì xem ai đã được học vs ai chưa được học linux chứ . Người chưa biết cậu bảo người ta thế có bằng đánh đố người ta àk ... :(

maynghien
13-04-2009, 05:32 PM
/tmp/ccHySVHA.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
cho em hỏi cái lỗi này là sao (chương trình hello word)

mushu
22-05-2010, 02:20 PM
DR có biết lệnh nào tuơng tự với getch() trên Turbo C không ? Mình thử #include <conio.h> thì nó báo lỗi không có file.

ANSI C không có cái này.
Bạn sài stdio.h rồi:

getchar()//nó có tính năng giống getch
Chú ý nữa là C trên *nux không có:

fflush(stdin)
Vì vậy để làm sạch bộ đệm phải làm thủ công đó.

Nói thêm khi compile làm thế này tiếp kiệm 1 kí tự so với Kevin Hoang(=D)>

$ cc program.c -o program
$ ./program

Mình thấy lập trình trên linux có vẻ trầm trên forum nhỉ.
Thi xong phải làm rộn lên mới được.

thanhdx216
22-11-2010, 01:28 PM
Uhm, lập trình C trên linux các công ty cũng ít làm. Nếu có làm thường họ lập trình Shell.

programmingvietnam
22-11-2010, 03:48 PM
Uhm, lập trình C trên linux các công ty cũng ít làm. Nếu có làm thường họ lập trình Shell.
Ở trường tớ có dạy Linux đâu mà đòi học C trên Linux (:-)?
Phiên bản mới nhất của linux ra cách đây bao lâu rồi các bác?