linux中用C语言对环境变量设置

89 篇文章 0 订阅
背景:做svn自动更新成root用c写的,但是其是root后,环境变量的HOME变量还是原来用户,需要转下,于是查了下C设置环境变量,达到了尽管能通过chmod u+s  resetServerAndOptSVN成root,但是这种root里的$_ENV还是原来用户的环境变量。 
这个c调用PHP时,其PHP用:print_r($_EVN);还是原来普通用户的环境变量,如下: 
[HOME] => /home/xiangdong [MAIL] => /var/spool/mail/xiangdong [USER] => xiangdong [LOGNAME] => xiangdong 
直接在PHP里修改,好像无效果,于是, 
从网上找到了一个通过C修改其环境变量的方法: 

#include<stdlib.h>

#include <stdio.h> 

main() 

{         

        char * p;         

       if((p=getenv("USER")))         

           printf("USER =%s\n",p);         

      setenv("USER","test",1);         

      printf("USER=%s\n",getenv("USER"));         

      unsetenv("USER");         

      printf("USER=%s\n",getenv("USER")); 

Run: 
[root@localhost tmp]# ./a.out 
USER =root 
USER=test 
USER=(null) 

摘自己:http://blog.csdn.net/xwdok/article/details/619728 

根据自己情况,实践OK如下: 

    //开始伪装成root环境变量,让SVN误认为.subversion在root目录下。    

 setenv("USER","root",1);    

 setenv("HOME","/root",1);     

 setenv("LOGNAME","root",1);    

 setenv("MAIL","/var/spool/mail/root",1);     //to avoid the error: TERM environment variable not set.     

 setenv("TERM","linux",1); 

相关知识点链接:https://justwinit.cn/post/7555/ 
关于用c语言提root权限:https://justwinit.cn/post/6975/ 
整个代码如下: 

#include <stdio.h> 

#include <string.h> 

#include <stdlib.h> 

#include <sys/types.h> 

#include <unistd.h> 

#include <stdarg.h> 

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

{     

uid_t uid ,euid;     

//char cmd[1024]; //变量暂时未使用     

uid = getuid() ;     

euid = geteuid();     

//printf("my uid :%u\n",getuid()); //这里显示的是当前的uid 可以注释掉.    www=48     

//printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid   root=0     

if(setreuid(euid, uid)) //交换这两个id         

perror("setreuid");     

//printf("after setreuid uid :%u\n",getuid());    

//   root=0     

//printf("afer sertreuid euid :%u\n",geteuid());  

//   www=48     

//开始伪装成root环境变量,让SVN误认为.subversion在root目录下。     

setenv("USER","root",1);     

setenv("HOME","/root",1);    

 setenv("LOGNAME","root",1);     

setenv("MAIL","/var/spool/mail/root",1);     //to avoid the error: TERM environment variable not set.     

setenv("TERM","linux",1);     

char command[36000];     

char opt[64];     

char path[36000];     

FILE *pPipe;     

char psBuffer[36000];     

strcpy(opt,argv[1]);    

 strcpy(path,argv[2]);     

//snprintf(command,sizeof(command),"/usr/local/php/bin/php /data/htdocs/tools.xiyou.cntv.cn/resetServerAndOptSVN.php %s %s",opt,path);   snprintf(command,sizeof(command),"/usr/local/php/bin/php ./getAndUpCodesServ.php %s %s",opt,path);     

if( (pPipe = popen( command, "r" )) == NULL )

{

//执行脚本         

printf("Excute Command Faild :%s",command);        

 exit( 1 );     

}    

 while(!feof(pPipe))/* Read pipe until end of file. */     

{         

if(fgets(psBuffer, sizeof(psBuffer), pPipe) != NULL)             

printf("%s",psBuffer);     

}    

 /* Close pipe and print return value of pPipe. */     

//printf( "\nProcess returned: %d\n", pclose( pPipe ) );     

pclose(pPipe);     

return 0; 

这里想通过对PWD的环境变量作修改,好像不行,但对USER、HOME、LOGNAME、TERM均可修改其变量,达到了通过setreuid由常规用户变为root用户修改环境变量的目的,后再执行PHP,也就是root了,本来想通过PHP里修改,修改失败,还是得C铺路后再进行PHP,这样就不再是常规帐号的Home了,于是执行svn时不再去找如:xiangdong‘s HOME=>/home/xiangdong/.subversion 而是去/root/.subversion去执行,权限更大,更符合手工执行的环境,svn相关操作的脚本执行相当可靠。EOF 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,可以使用C语言的条件变量和线程来实现消费者-生产者模型。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int item = 0; while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区已满,则等待消费者消费 while (count == BUFFER_SIZE) { pthread_cond_wait(&cond_prod, &mutex); } buffer[count] = item; count++; printf("Producer produced item %d\n", item); // 唤醒消费者线程 pthread_cond_signal(&cond_cons); pthread_mutex_unlock(&mutex); item++; } pthread_exit(NULL); } void *consumer(void *arg) { while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区为空,则等待生产者生产 while (count == 0) { pthread_cond_wait(&cond_cons, &mutex); } int item = buffer[count - 1]; count--; printf("Consumer consumed item %d\n", item); // 唤醒生产者线程 pthread_cond_signal(&cond_prod); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t producer_thread, consumer_thread; // 创建生产者和消费者线程 pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); // 等待线程结束 pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); return 0; } ``` 在上面的代码中,生产者线程不断地向缓冲区中生产数据,而消费者线程不断地从缓冲区中消费数据。当缓冲区满时,生产者线程会等待条件变量`cond_prod`,直到有消费者消费数据才会被唤醒。同样,当缓冲区为空时,消费者线程会等待条件变量`cond_cons`,直到有生产者生产数据才会被唤醒。 需要注意的是,在生产者和消费者线程之间共享的变量`count`和`buffer`需要进行互斥访问,因此使用了互斥锁`mutex`来保护共享资源的访问。 希望这个示例能帮助你理解如何在Linux中使用C语言的条件变量和线程实现消费者-生产者模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值