linux信號c語言,linux與c語言

本文目錄一覽:

Linux 環境下的C語言, 關於 kill 發送信號和 signal() 函數, 具體問題在以下代碼的注釋處

pause()會令目前的進程暫停(進入睡眠狀態), 直到被信號(signal)所中斷。

當50信號觸動了,pause將退出睡眠狀態,執行printf和return

c語言實例,linux線程同步的信號量方式 謝謝

這麼高的懸賞,實例放後面。信號量(sem),如同進程一樣,線程也可以通過信號量來實現通信,雖然是輕量級的。信號量函數的名字都以”sem_”打頭。線程使用的基本信號量函數有四個。

     信號量初始化。

     int sem_init (sem_t *sem , int pshared, unsigned int value);

    這是對由sem指定的信號量進行初始化,設置好它的共享選項(linux 只支持為0,即表示它是當前進程的局部信號量),然後給它一個初始值VALUE。

    等待信號量。給信號量減1,然後等待直到信號量的值大於0。

    int sem_wait(sem_t *sem);

    釋放信號量。信號量值加1。並通知其他等待線程。

    int sem_post(sem_t *sem);

    銷毀信號量。我們用完信號量後都它進行清理。歸還佔有的一切資源。

    int sem_destroy(sem_t *sem);

#include stdlib.h  

    #include stdio.h  

    #include unistd.h  

    #include pthread.h  

    #include semaphore.h  

    #include errno.h  

    #define return_if_fail(p) if((p) == 0){printf (“[%s]:func error!/n”, __func__);return;}  

    typedef struct _PrivInfo  

    {  

        sem_t s1;  

        sem_t s2;  

        time_t end_time;  

    }PrivInfo;  

    static void info_init (PrivInfo* thiz);  

    static void info_destroy (PrivInfo* thiz);  

    static void* pthread_func_1 (PrivInfo* thiz);  

    static void* pthread_func_2 (PrivInfo* thiz);  

    int main (int argc, char** argv)  

    {  

        pthread_t pt_1 = 0;  

        pthread_t pt_2 = 0;  

        int ret = 0;  

        PrivInfo* thiz = NULL;  

        thiz = (PrivInfo* )malloc (sizeof (PrivInfo));  

        if (thiz == NULL)  

        {  

            printf (“[%s]: Failed to malloc priv./n”);  

            return -1;  

        }  

        info_init (thiz);  

        ret = pthread_create (pt_1, NULL, (void*)pthread_func_1, thiz);  

        if (ret != 0)  

        {  

            perror (“pthread_1_create:”);  

        }  

        ret = pthread_create (pt_2, NULL, (void*)pthread_func_2, thiz);  

        if (ret != 0)  

        {  

            perror (“pthread_2_create:”);  

        }  

        pthread_join (pt_1, NULL);  

        pthread_join (pt_2, NULL);  

        info_destroy (thiz);  

        return 0;  

    }  

    static void info_init (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        thiz-end_time = time(NULL) + 10;  

        sem_init (thiz-s1, 0, 1);  

        sem_init (thiz-s2, 0, 0);  

        return;  

    }  

    static void info_destroy (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        sem_destroy (thiz-s1);  

        sem_destroy (thiz-s2);  

        free (thiz);  

        thiz = NULL;  

        return;  

    }  

    static void* pthread_func_1 (PrivInfo* thiz)  

    {  

        return_if_fail(thiz != NULL);  

        while (time(NULL)  thiz-end_time)  

        {  

            sem_wait (thiz-s2);  

            printf (“pthread1: pthread1 get the lock./n”);  

            sem_post (thiz-s1);  

            printf (“pthread1: pthread1 unlock/n”);  

            sleep (1);  

        }  

        return;  

    }  

    static void* pthread_func_2 (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        while (time (NULL)  thiz-end_time)  

        {  

            sem_wait (thiz-s1);  

            printf (“pthread2: pthread2 get the unlock./n”);  

            sem_post (thiz-s2);  

            printf (“pthread2: pthread2 unlock./n”);  

            sleep (1);  

        }  

        return;  

    }

linux下的C語言開發(管道通信)

姓名:馮成 學號:19020100164 學院:丁香二號書院

轉自:

【嵌牛導讀】本文將介紹linux下的C語言開發中的管道通信

【嵌牛鼻子】linux C語言 管道通信

【嵌牛提問】linux下的C語言開發中的管道通信是什麼?

Linux系統本身為進程間通信提供了很多的方式,比如說管道、共享內存、socket通信等。管道的使用十分簡單,在創建了匿名管道之後,我們只需要從一個管道發送數據,再從另外一個管道接受數據即可。

#include stdio.h

#include unistd.h

#include stdlib.h

#include string.h

int pipe_default[2]; 

int main()

{

    pid_t pid;

    char buffer[32];

    memset(buffer, 0, 32);

    if(pipe(pipe_default) 0)

    {

        printf(“Failed to create pipe!\n”);

        return 0;

    }

    if(0 == (pid = fork()))

    {

        close(pipe_default[1]);

        sleep(5);

        if(read(pipe_default[0], buffer, 32) 0)

        {

            printf(“Receive data from server, %s!\n”, buffer);

        }

        close(pipe_default[0]);

    }

    else

    {

        close(pipe_default[0]);

        if(-1 != write(pipe_default[1], “hello”, strlen(“hello”)))

        {

            printf(“Send data to client, hello!\n”);

        }

        close(pipe_default[1]);

        waitpid(pid, NULL, 0);

    }

    return 1;

}

    下面我們就可以開始編譯運行了,老規矩分成兩步驟進行:(1)輸入gcc pipe.c -o pipe;(2)然後輸入./pipe,過一會兒你就可以看到下面的列印了。

[test@localhost pipe]$ ./pipe

Send data to client, hello!

Receive data from server, hello!

怎麼用linux寫c語言

Linux正在成為開發人員的編程天堂,成為開源和免費操作系統。 Turbo C編譯器已經是一種編譯程序的舊方法,所以讓程序員轉向Linux以獲得新的編程環境。 在本文中,我們將解釋如何編寫,編譯和運行一個簡單的C程序。 這將成為您遷移到可以在Linux上編寫和執行的更複雜和有用的C程序的基礎。

我們在Ubuntu 18.04 LTS系統上運行了本文中提到的步驟和命令。

我們將使用Linux命令行工具Terminal,以編譯一個簡單的C程序。 要打開終端,您可以使用Ubuntu Dash或Ctrl + Alt + T快捷方式。

第1步:安裝build-essential軟體包

為了編譯和執行C程序,您需要在系統上安裝必要的軟體包。 在Linux終端中以root用戶身份輸入以下命令:

sudo apt-get install build-essential

系統會要求您輸入root用戶密碼; 安裝過程將在此之後開始。 請確保您已連接到互聯網。

第2步:編寫一個簡單的C程序

安裝必要的軟體包之後,讓我們編寫一個簡單的C程序。

打開Ubuntu的圖形文本編輯器,將以下示常式序寫入或複製到其中:

#includestdio.h

int main()

{

printf(“nA sample C program “);

return 0;

}

然後使用.c擴展名保存文件。 在這個例子中,我將我的C程序命名為linuxidc.c

或者,您可以通過gedit中的終端編寫C程序,如下所示:

gedit linuxidc.c

這將創建一個.c文件,您可以在其中編寫和保存程序。

第3步:使用gcc編譯C程序

在終端中,輸入以下命令以生成您編寫的程序的可執行版本:

句法:

$ gcc [programName].c -o programName

示例:

$ gcc linuxidc.c -o linuxidc

請教一個Linux下C語言的進程間的信號問題

linux中的進程通信分為三個部分:低級通信,管道通信和進程間通信IPC(inter process communication)。linux的低級通信主要用來傳遞進程的控制信號——文件鎖和軟中斷信號機制。linux的進程間通信IPC有三個部分——①信號量,②共享內存和③消息隊列。以下是我編寫的linux進程通信的C語言實現代碼。操作系統為redhat9.0,編輯器為vi,編譯器採用gcc。下面所有實現代碼均已經通過測試,運行無誤。

一.低級通信–信號通信

signal.c

#include

#include

#include

/*捕捉到信號sig之後,執行預先預定的動作函數*/

void sig_alarm(int sig)

{

printf(“—the signal received is %d. /n”, sig);

signal(SIGINT, SIG_DFL); //SIGINT終端中斷信號,SIG_DFL:恢復默認行為,SIN_IGN:忽略信號

}

int main()

{

signal(SIGINT, sig_alarm);//捕捉終端中斷信號

while(1)

{

printf(“waiting here!/n”);

sleep(1);

}

return 0;

}

二.管道通信

pipe.c

#include

#define BUFFER_SIZE 30

int main()

{

int x;

int fd[2];

char buf[BUFFER_SIZE];

char s[BUFFER_SIZE];

pipe(fd);//創建管道

while((x=fork())==-1);//創建管道失敗時,進入循環

/*進入子進程,子進程向管道中寫入一個字元串*/

if(x==0)

{

sprintf(buf,”This is an example of pipe!/n”);

write(fd[1],buf,BUFFER_SIZE);

exit(0);

}

/*進入父進程,父進程從管道的另一端讀出剛才寫入的字元串*/

else

{

wait(0);//等待子進程結束

read(fd[0],s,BUFFER_SIZE);//讀出字元串,並將其儲存在char s[]中

printf(“%s”,s);//列印字元串

}

return 0;

}

三.進程間通信——IPC

①信號量通信

sem.c

#include

#include

#include

#include types.h

#include ipc.h

#include sem.h

/*聯合體變數*/

union semun

{

int val; //信號量初始值

struct semid_ds *buf;

unsigned short int *array;

struct seminfo *__buf;

};

/*函數聲明,信號量定義*/

static int set_semvalue(void); //設置信號量

static void del_semvalue(void);//刪除信號量

static int semaphore_p(void); //執行P操作

static int semaphore_v(void); //執行V操作

static int sem_id; //信號量標識符

int main(int argc, char *argv[])

{

int i;

int pause_time;

char op_char = ‘O’;

srand((unsigned int)getpid());

sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);//創建一個信號量,IPC_CREAT表示創建一個新的信號量

/*如果有參數,設置信號量,修改字元*/

if (argc 1)

{

if (!set_semvalue())

{

fprintf(stderr, “Failed to initialize semaphore/n”);

exit(EXIT_FAILURE);

}

op_char = ‘X’;

sleep(5);

}

for(i = 0; i 10; i++)

{

/*執行P操作*/

if (!semaphore_p())

exit(EXIT_FAILURE);

printf(“%c”, op_char);

fflush(stdout);

pause_time = rand() % 3;

sleep(pause_time);

printf(“%c”, op_char);

fflush(stdout);

/*執行V操作*/

if (!semaphore_v())

exit(EXIT_FAILURE);

pause_time = rand() % 2;

sleep(pause_time);

}

printf(“/n%d – finished/n”, getpid());

if (argc 1)

{

sleep(10);

del_semvalue(); //刪除信號量

}

exit(EXIT_SUCCESS);

}

/*設置信號量*/

static int set_semvalue(void)

{

union semun sem_union;

sem_union.val = 1;

if (semctl(sem_id, 0, SETVAL, sem_union) == -1)

return(0);

return(1);

}

/*刪除信號量*/

static void del_semvalue(void)

{

union semun sem_union;

if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1)

fprintf(stderr, “Failed to delete semaphore/n”);

}

/*執行P操作*/

static int semaphore_p(void)

{

struct sembuf sem_b;

sem_b.sem_num = 0;

sem_b.sem_op = -1; /* P() */

sem_b.sem_flg = SEM_UNDO;

if (semop(sem_id, sem_b, 1) == -1)

{

fprintf(stderr, “semaphore_p failed/n”);

return(0);

}

return(1);

}

/*執行V操作*/

static int semaphore_v(void)

{

struct sembuf sem_b;

sem_b.sem_num = 0;

sem_b.sem_op = 1; /* V() */

sem_b.sem_flg = SEM_UNDO;

if (semop(sem_id, sem_b, 1) == -1)

{

fprintf(stderr, “semaphore_v failed/n”);

return(0);

}

return(1);

}

②消息隊列通信

send.c

#include

#include

#include

#include

#include

#include types.h

#include ipc.h

#include msg.h

#define MAX_TEXT 512

/*用於消息收發的結構體–my_msg_type:消息類型,some_text:消息正文*/

struct my_msg_st

{

long int my_msg_type;

char some_text[MAX_TEXT];

};

int main()

{

int running = 1;//程序運行標識符

struct my_msg_st some_data;

int msgid;//消息隊列標識符

char buffer[BUFSIZ];

/*創建與接受者相同的消息隊列*/

msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

if (msgid == -1)

{

fprintf(stderr, “msgget failed with error: %d/n”, errno);

exit(EXIT_FAILURE);

}

/*向消息隊列中發送消息*/

while(running)

{

printf(“Enter some text: “);

fgets(buffer, BUFSIZ, stdin);

some_data.my_msg_type = 1;

strcpy(some_data.some_text, buffer);

if (msgsnd(msgid, (void *)some_data, MAX_TEXT, 0) == -1)

{

fprintf(stderr, “msgsnd failed/n”);

exit(EXIT_FAILURE);

}

if (strncmp(buffer, “end”, 3) == 0)

{

running = 0;

}

}

exit(EXIT_SUCCESS);

}

receive.c

#include

#include

#include

#include

#include

#include types.h

#include ipc.h

#include msg.h

/*用於消息收發的結構體–my_msg_type:消息類型,some_text:消息正文*/

struct my_msg_st

{

long int my_msg_type;

char some_text[BUFSIZ];

};

int main()

{

int running = 1;//程序運行標識符

int msgid; //消息隊列標識符

struct my_msg_st some_data;

long int msg_to_receive = 0;//接收消息的類型–0表示msgid隊列上的第一個消息

/*創建消息隊列*/

msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

if (msgid == -1)

{

fprintf(stderr, “msgget failed with error: %d/n”, errno);

exit(EXIT_FAILURE);

}

/*接收消息*/

while(running)

{

if (msgrcv(msgid, (void *)some_data, BUFSIZ,msg_to_receive, 0) == -1)

{

fprintf(stderr, “msgrcv failed with error: %d/n”, errno);

exit(EXIT_FAILURE);

}

printf(“You wrote: %s”, some_data.some_text);

if (strncmp(some_data.some_text, “end”, 3) == 0)

{

running = 0;

}

}

/*刪除消息隊列*/

if (msgctl(msgid, IPC_RMID, 0) == -1)

{

fprintf(stderr, “msgctl(IPC_RMID) failed/n”);

exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);

}

③共享內存通信

share.h

#define TEXT_SZ 2048 //申請共享內存大小

struct shared_use_st

{

int written_by_you; //written_by_you為1時表示有數據寫入,為0時表示數據已經被消費者提走

char some_text[TEXT_SZ];

};

producer.c

#include

#include

#include

#include

#include types.h

#include ipc.h

#include shm.h

#include “share.h”

int main()

{

int running = 1; //程序運行標誌位

void *shared_memory = (void *)0;

struct shared_use_st *shared_stuff;

char buffer[BUFSIZ];

int shmid; //共享內存標識符

/*創建共享內存*/

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);

if (shmid == -1)

{

fprintf(stderr, “shmget failed/n”);

exit(EXIT_FAILURE);

}

/*將共享內存連接到一個進程的地址空間中*/

shared_memory = shmat(shmid, (void *)0, 0);//指向共享內存第一個位元組的指針

if (shared_memory == (void *)-1)

{

fprintf(stderr, “shmat failed/n”);

exit(EXIT_FAILURE);

}

printf(“Memory attached at %X/n”, (int)shared_memory);

shared_stuff = (struct shared_use_st *)shared_memory;

/*生產者寫入數據*/

while(running)

{

while(shared_stuff-written_by_you == 1)

{

sleep(1);

printf(“waiting for client…/n”);

}

printf(“Enter some text: “);

fgets(buffer, BUFSIZ, stdin);

strncpy(shared_stuff-some_text, buffer, TEXT_SZ);

shared_stuff-written_by_you = 1;

if (strncmp(buffer, “end”, 3) == 0)

{

running = 0;

}

}

/*該函數用來將共享內存從當前進程中分離,僅使得當前進程不再能使用該共享內存*/

if (shmdt(shared_memory) == -1)

{

fprintf(stderr, “shmdt failed/n”);

exit(EXIT_FAILURE);

}

printf(“producer exit./n”);

exit(EXIT_SUCCESS);

}

customer.c

#include

#include

#include

#include

#include types.h

#include ipc.h

#include shm.h

#include “share.h”

int main()

{

int running = 1;//程序運行標誌位

void *shared_memory = (void *)0;

struct shared_use_st *shared_stuff;

int shmid; //共享內存標識符

srand((unsigned int)getpid());

/*創建共享內存*/

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);

if (shmid == -1)

{

fprintf(stderr, “shmget failed/n”);

exit(EXIT_FAILURE);

}

/*將共享內存連接到一個進程的地址空間中*/

shared_memory = shmat(shmid, (void *)0, 0);//指向共享內存第一個位元組的指針

if (shared_memory == (void *)-1)

{

fprintf(stderr, “shmat failed/n”);

exit(EXIT_FAILURE);

}

printf(“Memory attached at %X/n”, (int)shared_memory);

shared_stuff = (struct shared_use_st *)shared_memory;

shared_stuff-written_by_you = 0;

/*消費者讀取數據*/

while(running)

{

if (shared_stuff-written_by_you)

{

printf(“You wrote: %s”, shared_stuff-some_text);

sleep( rand() % 4 );

shared_stuff-written_by_you = 0;

if (strncmp(shared_stuff-some_text, “end”, 3) == 0)

{

running = 0;

}

}

}

/*該函數用來將共享內存從當前進程中分離,僅使得當前進程不再能使用該共享內存*/

if (shmdt(shared_memory) == -1)

{

fprintf(stderr, “shmdt failed/n”);

exit(EXIT_FAILURE);

}

/*將共享內存刪除,所有進程均不能再訪問該共享內存*/

if (shmctl(shmid, IPC_RMID, 0) == -1)

{

fprintf(stderr, “shmctl(IPC_RMID) failed/n”);

exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);

}

摘自:

linux中c語言有關信號的程序

簡單處理了一下,希望對你有幫助

#define err_sys( str ) printf(“error:%s\n” , str )

static void sig_int(int signo)

{

struct tms timebuf;

int wallclock=times(timebuf);

fprintf(stderr,”clock ticks since system startup are %d,\n”,wallclock);

}

static void sig_term(int signo)

{

struct tms timebuf;

int wallclock=times(timebuf);

fprintf(stderr,”clock ticks since system start are %d,\n”,wallclock);

exit(0); //終止程序

}

static void sig_alrm(int signo)

{

static int times=1;

alarm(0);//輸出時,不再計時

printf(“time:%d\n” , times*10 );

times++ ;

alarm(10); //重新開始計時

}

int main()

{

if (signal(SIGINT,sig_int)==SIG_ERR)

err_sys(“can’t catch SIGINT”);

if (signal(SIGTERM,sig_term)==SIG_ERR)

err_sys(“can’t catch SIGTERM”);

alarm(10); //開始計時

if (signal(SIGALRM,sig_alrm)==SIG_ERR)

err_sys(“can’t catch SIGALRM”);

while(1) ; //等待在這裡

return(0);

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293020.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 18:38
下一篇 2024-12-25 18:38

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論