点击这里给我发消息 点击这里给我发消息

从0开始学习linux C编程

添加时间:2013-12-7
    相关阅读: 软件 程序 linux 链接
副标题#e#

    我是在windows xp-sp2上使用SSHSecureShellClient-3[1].2.9.exe进行linuxC编程的,下面先讲一下怎么使用这个软件:

    在本地安装SSHSecureShellClient-3[1].2.9.exe,在服务器上建立用户名和密码,然后打开SSH Secure Shell Client,enter键或者点击quick connect,输入目标机(我不懂,瞎叫)ip,输入用户名,enter键,输入密码。现在你应该已经进入linux了,在这里所有的linux命令都可以使用,新手不妨先敲几个常用的命令试一下!

    下面从最简单的hello word讲到比较复杂的库引用,当然怎么写通用的makefile限于水平,不做讨论。

    1、hello word

    1)、程序:

 #include <stdio.h>

int main(void)
{
 printf ("hello, wordn");

 return 0;
}
名字为helloword.c

    2)、运行:

    进入SSH Secure Shell Client,使用 《cd 路径名》进入到你的helloword.c所在的目录,

    然后gcc -o helloword helloword.c,下面将显示编译的情况,有错误和警告将会列出,没有则不显示而返回的你刚才进的目录,要运行则输入。/helloword, 这样就会看到hello, word

    2、编译多个。c和。h文件组成的程序,这时需要写makefile

    1)、程序:

 #include "mytool1.h"
#include "mytool2.h"

int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

名字为main.c

#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %sn",print_str);
}
名字为mytool1.c

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H 

void mytool1_print(char *print_str);

#endif
名字为mytool1.h

#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %sn",print_str);
}
名字为mytool2.c

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H

void mytool2_print(char *print_str);

#endif
名字为mytool2.h

    2)、makefile
 main:main.o mytool1.o mytool2.o
 gcc -o main main.o mytool1.o mytool2.o
 main.o:main.c mytool1.h mytool2.h
 gcc -c main.c
 mytool1.o:mytool1.c mytool1.h
 gcc -c mytool1.c
 mytool2.o:mytool2.c mytool2.h
 gcc -c mytool2.c
    3)/运行
 [root@svn helloword]# cd -
/home/mengj
[root@svn mengj]# cd makefileexample
[root@svn makefileexample]# make
cc﹛﹛﹛ -c -o main.o main.c
cc﹛﹛﹛ -c -o mytool1.o mytool1.c
mytool1.c: In function 滵ytool1_print?
mytool1.c:4: warning: incompatible implicit declaration of built-in function 漥rintf?
cc﹛﹛﹛ -c -o mytool2.o mytool2.c
mytool2.c: In function 滵ytool2_print?
mytool2.c:4: warning: incompatible implicit declaration of built-in function 漥rintf?
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
make: main.o:main.c: Command not found
make: *** [main] Error 127
[root@svn makefileexample]# ./main
This is mytool1 print hello
This is mytool2 print hello
[root@svn makefileexample]#

    上面就是这个程序的运行过程

 

#p#副标题#e#

    先进入目录,然后make,编译通过运行。/make

    3、需要连接库的程序,这个过程相对复杂

    1)、程序

 /*
 * gjobread.c : a small test program for gnome jobs XML format
 *
 * See Copyright for the status of this software.
 *
 * Daniel.Veillard@w3.org
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*
 * This example should compile and run indifferently with libxml-1.8.8 +
 * and libxml2-2.1.0 +
 * Check the COMPAT comments below
 */

/*
 * COMPAT using xml-config --cflags to get the include path this will
 * work with both
 */
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

#define DEBUG(x) printf(x)

/*
 * A person record
 * an xmlChar * is really an UTF8 encoded char string (0 terminated)
 */
typedef struct person {
    xmlChar *name;
    xmlChar *email;
    xmlChar *company;
    xmlChar *organisation;
    xmlChar *smail;
    xmlChar *webPage;
    xmlChar *phone;
} person, *personPtr;

/*
 * And the code needed to parse it
 */
static personPtr
parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
    personPtr ret = NULL;

DEBUG("parsePersonn");
    /*
     * allocate the struct
     */
    ret = (personPtr) malloc(sizeof(person));
    if (ret == NULL) {
        fprintf(stderr,"out of memoryn");
 return(NULL);
    }
    memset(ret, 0, sizeof(person));

    /* We don't care what the top level element name is */
    /* COMPAT xmlChildrenNode is a macro unifying libxml1 and libxml2 names */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!xmlStrcmp(cur->name, (const xmlChar *)"Person")) &&
     (cur->ns == ns))
     ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!xmlStrcmp(cur->name, (const xmlChar *)"Email")) &&
     (cur->ns == ns))
     ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
 cur = cur->next;
    }

    return(ret);
}

/*
 * and to print it
 */
static void
printPerson(personPtr cur) {
    if (cur == NULL) return;
    printf("------ Personn");
    if (cur->name) printf(" name: %sn", cur->name);
    if (cur->email) printf(" email: %sn", cur->email);
    if (cur->company) printf(" company: %sn", cur->company);
    if (cur->organisation) printf(" organisation: %sn", cur->organisation);
    if (cur->smail) printf(" smail: %sn", cur->smail);
    if (cur->webPage) printf(" Web: %sn", cur->webPage);
    if (cur->phone) printf(" phone: %sn", cur->phone);
    printf("------n");
}

/*
 * a Description for a Job
 */
typedef struct job {
    xmlChar *projectID;
    xmlChar *application;
    xmlChar *category;
    personPtr contact;
    int nbDevelopers;
    personPtr developers[100]; /* using dynamic alloc is left as an exercise */
} job, *jobPtr;

/*
 * And the code needed to parse it
 */
static jobPtr
parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
    jobPtr ret = NULL;

DEBUG("parseJobn");
    /*
     * allocate the struct
     */
    ret = (jobPtr) malloc(sizeof(job));
    if (ret == NULL) {
        fprintf(stderr,"out of memoryn");
 return(NULL);
    }
    memset(ret, 0, sizeof(job));

    /* We don't care what the top level element name is */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
       
        if ((!xmlStrcmp(cur->name, (const xmlChar *) "Project")) &&
     (cur->ns == ns)) {
     ret->projectID = xmlGetProp(cur, (const xmlChar *) "ID");
  printf("ret->projectID: %sn", ret->projectID);
     if (ret->projectID == NULL) {
  fprintf(stderr, "Project has no IDn");
     }
 }
        if ((!xmlStrcmp(cur->name, (const xmlChar *) "Application")) &&
            (cur->ns == ns))
     ret->application =
  xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!xmlStrcmp(cur->name, (const xmlChar *) "Category")) &&
     (cur->ns == ns))
     ret->category =
  xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!xmlStrcmp(cur->name, (const xmlChar *) "Contact")) &&
     (cur->ns == ns))
     ret->contact = parsePerson(doc, ns, cur);
 cur = cur->next;
    }

    return(ret);
}

/*
 * and to print it
 */
static void
printJob(jobPtr cur) {
    int i;

    if (cur == NULL) return;
    printf("=======  Jobn");
    if (cur->projectID != NULL) printf("projectID: %sn", cur->projectID);
    if (cur->application != NULL) printf("application: %sn", cur->application);
    if (cur->category != NULL) printf("category: %sn", cur->category);
    if (cur->contact != NULL) printPerson(cur->contact);
    printf("%d developersn", cur->nbDevelopers);

    for (i = 0;i < cur->nbDevelopers;i++) printPerson(cur->developers[i]);
    printf("======= n");
}

/*
 * A pool of Gnome Jobs
 */
typedef struct gjob {
    int nbJobs;
    jobPtr jobs[500]; /* using dynamic alloc is left as an exercise */
} gJob, *gJobPtr;


static gJobPtr
parseGjobFile(char *filename) {
    xmlDocPtr doc;
    gJobPtr ret;
    jobPtr curjob;
    xmlNsPtr ns;
    xmlNodePtr cur;

    /*
     * build an XML tree from a the file;
     */
    doc = xmlParseFile(filename);
    if (doc == NULL) return(NULL);

    /*
     * Check the document is of the right kind
     */
   
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty documentn");
 xmlFreeDoc(doc);
 return(NULL);
    }
    ns = xmlSearchNsByHref(doc, cur,
     (const xmlChar *) "http://www.gnome.org/some-location");
    if (ns == NULL) {
        fprintf(stderr,
         "document of the wrong type, GJob Namespace not foundn");
 xmlFreeDoc(doc);
 return(NULL);
    }
    if (xmlStrcmp(cur->name, (const xmlChar *) "Helping")) {
        fprintf(stderr,"document of the wrong type, root node != Helping");
 xmlFreeDoc(doc);
 return(NULL);
    }
 printf("cur->name: %sn", cur->name);

    /*
     * Allocate the structure to be returned.
     */
    ret = (gJobPtr) malloc(sizeof(gJob));
 printf("sizeof(gJob): %dn", sizeof(gJob));
    if (ret == NULL) {
        fprintf(stderr,"out of memoryn");
 xmlFreeDoc(doc);
 return(NULL);
    }
    memset(ret, 0, sizeof(gJob));

    /*
     * Now, walk the tree.
     */
    /* First level we expect just Jobs */
    cur = cur->xmlChildrenNode;
    while ( cur && xmlIsBlankNode ( cur ) )
      {
 cur = cur -> next;
      }
    if ( cur == 0 )
      return ( NULL );
    if ((xmlStrcmp(cur->name, (const xmlChar *) "Jobs")) || (cur->ns != ns)) {
        fprintf(stderr,"document of the wrong type, was '%s', Jobs expected",
  cur->name);
 fprintf(stderr,"xmlDocDump followsn");
 xmlDocDump ( stderr, doc );
 fprintf(stderr,"xmlDocDump finishedn");
 xmlFreeDoc(doc);
 free(ret);
 return(NULL);
    }
 printf("cur->name: %sn", cur->name);
 printf("cur->ns: %dn", cur->ns);

    /* Second level is a list of Job, but be laxist */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!xmlStrcmp(cur->name, (const xmlChar *) "Job")) &&
     (cur->ns == ns)) {
     curjob = parseJob(doc, ns, cur);
     if (curjob != NULL)
         ret->jobs[ret->nbJobs++] = curjob;
            if (ret->nbJobs >= 500) break;
 }
 cur = cur->next;
    }

    return(ret);
}

static void
handleGjob(gJobPtr cur) {
    int i;

    /*
     * Do whatever you want and free the structure.
     */
    printf("%d Jobs registeredn", cur->nbJobs);
    for (i = 0; i < cur->nbJobs; i++) printJob(cur->jobs[i]);
}

int main(int argc, char **argv) {
 printf("test start!n");
    int i;
    gJobPtr cur;

    /* COMPAT: Do not genrate nodes for formatting spaces */
    LIBXML_TEST_VERSION
    xmlKeepBlanksDefault(0);

    for (i = 1; i < argc ; i++) {
 cur = parseGjobFile(argv[i]);
 if ( cur )
   handleGjob(cur);
 else
   fprintf( stderr, "Error parsing file '%s'n", argv[i]);

    }

    /* Clean up everything else before quitting. */
    xmlCleanupParser();
 printf("test end!n");

    return(0);
}

    2)、链接库#include <libxml/xmlmemory.h> #include <libxml/parser.h>

    libxml所在的目录为/home/mengj/libxml/inlcude 这个目录里安装了libxml2

    安装的过程是在网上下载然后

    (a) ./configure

    (b) make

    (c)make install

    3)、运行

 [root@svn example1]# gcc -o 1 1.c -L/home/mengj/libxml/include -lxml2 -I/home/mengj/libxml/include
[root@svn example1]# ./1 1.xml
test start!
cur->name: Helping
sizeof(gJob): 2004
cur->name: Jobs
cur->ns: 157174584
parseJob
ret->projectID: 12
parsePerson
1 Jobs registered
=======  Job
projectID: 12
application: GBackup
category: Development
------ Person
        name: Nathan Clemons
        email: nathan@windsofstorm.net
------
0 developers
=======
test end!
[root@svn example1]#


-L/home/mengj/libxml/include -lxml2 -I/home/mengj/libxml/include
表示需要连接的库所在的路径

    ok, 到这里我已经花了两天时间熟悉,如果写的足够简洁希望以后的新手能在一个上午搞定!

相关从0开始学习linux&nbsp;C编程

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册