<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    嵌入式Linux系統編程常見問題解答(一)

    發布時間:2013-11-26 11:22    發布者:edu118gct
    關鍵詞: 編程

    1:使用用基于文件指針的文件操作函數,實現把文本文件a.txt中的內容復制到b.txt中,b.txt中原來的內容被覆蓋。
    答案:
    #include
    int main()
    {
        FILE *fpa = fopen("a.txt", "rb");
        FILE *fpb = fopen("b.txt", "wb");
        char ch;
        while((ch = fgetc(fpa)) != EOF)
        {
            fputc(ch, fpb);
        }
        fclose(fpa);
        fclose(fpb);
        return 0;
    }

    2:用基于文件描述符的文件操作函數,實現自己的簡單的cp命令:mycp, 命令格式如:./mycp a.txt b.txt,把a.txt復制為b.txt。 要能實現單個文件的復制,以及從指定路徑復制文件到指定路徑中。
    答案:
    #include
    #include
    #include
    #include
    #include
    #include
    int main(int argc, char *argv[])
    {
        char buf[512] = {0};
        int fo1 = open(argv[1], O_RDONLY);
        int fo2 = open(argv[2], O_WRONLY | O_CREAT | O_EXCL, 0755);
        if(fo2 == -1)
        {
            printf("error! file exist!\n");
            exit(0);
        }
        int fr = 0;
        /*開始復制*/
        while( (fr = read(fo1, buf, sizeof(buf))) > 0 )
        {
            write(fo2, buf, fr);
        }
        close(fo1);
        close(fo2);
        return 0;
    }

    3:從命令行傳入某個.c或.txt文件的文件名,實現以下功能。
    1):對該文件的每個字符做如下變換:如果是大寫字母就變為小寫,如果是小寫字母就變為大寫,并寫回原文件,其它字符不變。
    2):輸出該文件的大小,文件類型,鏈接數,最后修改時間。
    3):測試當前用戶對該文件的權限(讀、寫、執行)。
    要求:模塊化編程,用函數實現不同的功能模塊,再通過函數指針調用相關函數。
    主函數只做:打開文件,調用函數,關閉文件。
    另外,對文件讀寫之前,要加鎖,讀寫完畢后,再解鎖。
    答案:
    /*源代碼*/
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    /*大小寫互相轉換*/
    void zhuanhuan(int fd)
    {
            char c;
            struct flock lock = {F_WRLCK, SEEK_SET, 0, 0, getpid()};

            if(-1 == fcntl(fd, F_SETLK, &lock))
            {
                    perror("lock failed!\n");
                    exit(-1);
            }
            while((read(fd, &c, sizeof(char)) > 0))
            {
                    if(c >= 'A'&& c <= 'Z')
                            c = c + 'a' - 'A';
                    else if(c >= 'a' && c <= 'z')
                            c = c - 32;
                    else
                            continue;
                    lseek(fd, -1, SEEK_CUR);
                    write(fd, &c, sizeof(char));
            }
            lock.l_type = F_UNLCK;
            if(-1 == fcntl(fd, F_SETLK, &lock))
            {
                    perror("unlock failed!\n");
                    exit(-1);
            }

    }
    /*檢測權限*/
    void quanxian(char *filename)
    {
            if(!access(filename, F_OK))
            {
                    if(!access(filename, R_OK))
                            printf("r");
                    else
                            printf("-");
                    if(!access(filename, W_OK))
                            printf("w");
                    else
                            printf("-");
                    if(!access(filename, X_OK))
                            printf("x");
                    else
                            printf("-");
            }
            else
                    printf("file not exist!\n");
    }
    /*獲取文件信息*/
    void xinxi(int fd)
    {
            struct stat a;
            if(-1 == fstat(fd, &a))
            {
                    perror("fstat error");
                    exit(-1);
            }

            if(S_ISREG(a.st_mode))
                    printf("-");
            else if(S_ISDIR(a.st_mode))
                    printf("d");
            else if(S_ISLNK(a.st_mode))
                    printf("l");
            else if(S_ISCHR(a.st_mode))
                    printf("c");
            else if(S_ISBLK(a.st_mode))
                    printf("b");
            else if(S_ISFIFO(a.st_mode))
                    printf("p");
            else if(S_ISSOCK(a.st_mode))
                    printf("s");
            printf(" %d", a.st_nlink);
            printf(" %d", a.st_size);

            struct tm *pTm;
            pTm = gmtime(&a.st_mtime);
            printf(" %04d-%02d-%02d",(1900 + pTm->tm_year), (1 + pTm->tm_mon), (pTm->tm_mday));
            printf(" %02d:%02d:%02d\n",(8 + pTm->tm_hour), (pTm->tm_min), (pTm->tm_sec));
    }
    /*該函數調用一系列函數實現各個功能*/
    void diaoyong(int fd, char *filename)
    {
            /*定義函數指針*/
            void (*pfun1)(int);        
            void (*pfun2)(char *);
            void (*pfun3)(int);

            pfun1 = zhuanhuan;
            pfun2 = quanxian;
            pfun3 = xinxi;

            pfun1(fd);
            pfun2(filename);
            pfun3(fd);
    }

    int main(int a, char *b[])
    {
            int fd = open(b[1], O_RDWR);
            if(-1 == fd)
            {
                    perror("open failed!\n");
                    exit(-1);
            }

            diaoyong(fd, b[1]);

            close(fd);
            return 0;
    }

    4:先用fork函數創建一個子進程,然后父進程從鍵盤輸入一個字符串,在子進程中輸出這個字符串。編寫程序過程中,注意避免造成孤兒進程和僵尸進程。要求用之前學的知識去實現。
    答案:
    #include
    #include
    #include
    #include
    #include
    #include
    int main()
    {
        char buf[50] = {0};
        int pid = fork();
        if(pid > 0)
        {
            printf("父進程:Enter a string:");
            scanf("%s", buf);
            int fd = open("a.txt",O_WRONLY|O_CREAT);
            write(fd, buf, sizeof(buf));//父進程把字符串寫入文件
                    close(fd);
            waitpid(pid, NULL, 0);
        }        
        else
        {
            sleep(5);
            int fd = open("a.txt",O_RDONLY);
            read(fd, buf, sizeof(buf));//子進程可以從該文件中讀出該字符串.
            close(fd);
            printf("子進程:The string is:%s\n", buf);
        }
        return 0;
    }

    5:寫一個顯示時間的程序,終端下動態顯示時間,并且時間在走。
    答案:
    #include
    #include
    int main()
    {
            time_t n;
            struct tm *p;
            while(1)
            {
                    system("clear");
                    time(&n);//獲取日歷時間
                    p = localtime(&n);//轉換為本地時間
                    printf("%4d-%d-%d:%d:%d:%d\n", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
                    sleep(1);
            }
            return 0;
    }專業嵌入式技術實訓,咨詢郭老師QQ754634522

    本文地址:http://www.portaltwn.com/thread-123766-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    上網去溜溜 發表于 2013-12-11 10:01:45
    廣告。。!
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷