程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C指針原理(88)

C指針原理(88)

編輯:關於C

一、在linux平台下,每個線程可有專用數據:

#include

#include
struct mydata{
int x;
char c[4];
};
pthread_t pthreada,pthreadb;
pthread_key_t datakey;//每個進程創建一次,不同的線程,同樣名字的鍵指向不同的地方


void *cleanup_mydata(void *dataptr){//刪除鍵時調用的
free((struct mydata*)dataptr);
}
void anum1(){
int rc;
struct mydata *mdata=(struct mydata*)malloc(sizeof(struct mydata));
mdata->x=1;
mdata->c[0]='a';
mdata->c[1]='\0';
rc=pthread_setspecific(datakey,(void*)mdata);//設置鍵指向的值,注意這個mdata為值的內存,必須使用指針的方式指向內存
sleep(1);
struct mydata *mmdata=(struct mydata*)pthread_getspecific(datakey);//取出鍵指向的值,注意這個mdata為值的內存,必須使用指針的方式指向內存
printf("-%d-%s\n",mmdata->x,mmdata->c);
fflush(stdout);
}
void bnum2(){
int rc;
struct mydata *mdata=(struct mydata*)malloc(sizeof(struct mydata));
mdata->x=2;
mdata->c[0]='b';
mdata->c[1]='\0';
rc=pthread_setspecific(datakey,(void*)mdata);//設置鍵指向的值,注意這個mdata為值的內存,必須使用指針的方式指向內存
sleep(1);
struct mydata *mmdata=(struct mydata*)pthread_getspecific(datakey);//取出鍵指向的值,注意這個mdata為值的內存,必須使用指針的方式指向內存
printf("-%d-%s\n",mmdata->x,mmdata->c);
fflush(stdout);
}


int main(void){


int rc;


rc=pthread_key_create(&datakey,cleanup_mydata);//為鍵刪除時的清理函數
pthread_create(&pthreada,NULL,anum1,NULL);
pthread_create(&pthreadb,NULL,bnum2,NULL);
sleep(3);
pthread_join(pthreada,NULL);
pthread_join(pthreadb,NULL);
rc=pthread_key_delete(datakey); //僅刪除鍵,但不刪除值指向的內存,線程終止調用用戶自定義的刪除函數,本例中為cleanup_mydata

}

二、摸擬shell

本博客所有內容是原創,如果轉載請注明來源

http://blog.csdn.net/myhaspl/


通過execlp函數來實現 ,execlp函數用於執行文件

其參數與說明為:

#include 

int execlp( const char * file, 
            const char * arg0, 
            const char * arg1,
            … 
            const char * argn, 
            NULL );

Arguments:

file
Used to construct a pathname that identifies the new process image file. If the fileargument contains a slash character, the file argument is used as the pathname for the file. Otherwise, the path prefix for this file is obtained by a search of the directories passed as the environment variable PATH.
arg0, …, argn
Pointers to NULL-terminated character strings. These strings constitute the argument list available to the new process image. Terminate the list terminated with a NULL pointer. The arg0 argument must point to a filename that's associated with the process.

waitpid()

wait for process termination

Function

SYNOPSIS DESCRIPTION PARAMETERS RETURN VALUES CONFORMANCE MULTITHREAD SAFETY LEVEL PORTING ISSUES AVAILABILITY SEE ALSO

SYNOPSIS

#include

#include

pid_t waitpid(pid_t pid, int *stat_loc, int options);


DESCRIPTION

The waitpid() function lets the calling process obtain status information about one of its child processes. If status information is available for two or more child processes, the order in which their status is reported is unspecified. If more than one thread is suspended in waitpid() awaiting termination of the same process, exactly one thread returns the process status at the time of the target child process termination. The other threads return -1, with errno set to ECHILD.

If the calling process sets SIGCHLD to SIG_IGN, and the process has no unwaited for children that were transformed into zombie processes, the calling thread blocks until all of the children of the process terminate, at which time waitpid() returns -1 with errno set to ECHILD.

If the parent process terminates without waiting for all of its child processes to terminate, the remaining child processes are assigned a new parent process ID corresponding to a system-level process.


PARAMETERS

pid

Specifies a set of child processes for which the status is requested:

  • If pid is equal to -1, status is requested for any child process. In this respect, waitpid() is equivalent to wait().
  • If pid is greater than 0, it specifies the process ID of a single child process for which status is requested.
  • If pid is 0, status is requested for any child process whose process group ID is equal to that of the calling process. This setting is not currently supported.
  • If pid is less than -1, status is requested for any child process whose process group ID is equal to the absolute value of pid. This setting is not currently supported.
    stat_loc

    Specifies the location to which the child process' exit status is stored. If NULL is passed, no exit status is returned. Otherwise, the following macros defined in can be used to evaluate the returned status:

    WIFEXITED(s)

    Evaluates to a non-zero value if status was returned for a child process that exited normally.

    WEXITSTATUS(s)

    If the value of WIFEXITED(s) is non-zero, this macro evaluates to the low-order 8 bits of the status argument that the child process passed to exit() or _exit(), or to the value that the child process returned from main().

    WIFSIGNALED(s)

    Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught.

    WTERMSIG(s)

    If the value of WIFSIGNALED(s) is non-zero, this macro evaluates to the number of the signal that caused the termination of the child process.

    WIFCORED(s)

    Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught, and whose default action is to dump core.

    WCOREDUMP(s)

    Evaluates to a non-zero value if status was returned for a child process that terminated due to receipt of a signal that was not caught, and whose default action is to dump core.

    WCORESIG(s)

    If the value of WIFCORED(s) is non-zero, this macro evaluates to the number of the signal that caused the termination of the child process.

    WIFSTOPPED(s)

    Evaluates to a non-zero value if status was returned for a child process that is currently stopped.

    WSTOPSIG(s)

    If the value of WIFSTOPPED(s) is non-zero, this macro evaluates to the number of the signal that caused the child process to stop.

    options

    Is the bitwise inclusive-OR of zero or more of the following flags, defined in :

    WNOHANG

    The waitpid() function does not suspend execution of the calling thread if status is not immediately available for one of the child processes specified by pid.

    WUNTRACED

    The status of any child processes specified by pid that are stopped, and whose status has not yet been reported since they stopped, is also reported to the requesting thread. This value is currently not supported, and is ignored.


    RETURN VALUES

    If waitpid() was invoked with WNOHANG set in options, and there are children specified by pid for which status is not available, waitpid() returns 0. If WNOHANG was not set,waitpid() returns the process ID of a child when the status of that child is available. Otherwise, it returns -1 and sets errno to one of the following values:

    ECHILD

    The process or process group specified by pid does not exist or is not a child of the calling process.

    EFAULT

    stat_loc is not a writable address.

    EINTR

    The function was interrupted by a signal. The value of the location pointed to by stat_loc is undefined.

    EINVAL

    The options argument is not valid.

    ENOSYS

    pid specifies a process group (0 or less than -1), which is not currently supported.



    程序如下:
    #include
    #include




    #define MAXLINE 100
    //execlp模擬SHELL




    int main(void){
    int pid;
    int jg,status,len;
    char buf[MAXLINE];




    printf("\n##myhaspl~~");//自定義的shell提示符
    while(fgets(buf,MAXLINE,stdin)!=NULL){//讀入一行
    len=strlen(buf)-1;
    if (buf[len]=='\n'){ //去除換行符,execlp只接受以NULL結尾
    buf[len]=0;
    }
    pid=fork();
    if (pid<0){
    printf("fork error!\n");
    }
    else if (pid==0){//子進程
    printf("\n");
    if (buf[0]=='Q'&&strlen(buf)==1){//鍵入Q表示退出shell
    exit(200);
    }
    jg=execlp(buf,buf,(char *)0);
    if (jg==-1){//錯誤
    printf("不能執行:%s\n",buf);
    exit(127);
    }
    exit(0);
    }
    if ((jg==waitpid(pid,&status,0))<0){//父進程
    printf("waitpid error\n");
    }
    if (WEXITSTATUS(status)==200) {//WEXITSTATUS計算返回值
    printf("退出....\n");
    break;
    }
    printf("\n##myhaspl~~");//自定義的shell提示符
    }
    exit(0);
    }
    執行:
    deepfuture@deepfuture-laptop:~/private/mytest$ gcc -o test21 test21.c
    test21.c: In function ‘main’:
    test21.c:15: warning: incompatible implicit declaration of built-in function ‘strlen’
    test21.c:26: warning: incompatible implicit declaration of built-in function ‘exit’
    test21.c:28: warning: incompatible implicit declaration of built-in function ‘execlp’
    test21.c:31: warning: incompatible implicit declaration of built-in function ‘exit’
    test21.c:33: warning: incompatible implicit declaration of built-in function ‘exit’
    test21.c:44: warning: incompatible implicit declaration of built-in function ‘exit’
    deepfuture@deepfuture-laptop:~/private/mytest$ ./test21


    ##myhaspl~~ls


    1 pvmtest test20 testbswap testmul.s x
    ex.txt test test20.c testbswap.s testmutex x.c
    gmon.out test12.s test21 test.c testmutex.c xx
    hello test13 test21.c test.c~ testpopen xx.c
    hello.c test13.c test2.c testmes testpopen.c xx.txt
    hello.o test15 test6 testmes.c testpvm1.c xxx.txt
    hello.s test15.c test66 testmesrecv testpvm2.c xxxx.txt
    main test19 test66.s testmesrecv.c testpx xy
    main.c test19.c test6.c testmessnd testpx1
    main.c~ test1.c testasmc testmessnd.c testpx1.s
    myhello.txt test2 testasmc.c testmul testpx.s


    ##myhaspl~~xx


    不能執行:xx


    ##myhaspl~~Q


    退出....

    本博客所有內容是原創,如果轉載請注明來源

    http://blog.csdn.net/myhaspl/


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved